- package heima;
- public class Demo {
- public static void main(String[] args) {
- TestOne one = null;
- try {
- Class cla = Class.forName("heima.TestOne");// 进行heima.TestOne类加载,返回一个Class对象
- System.out.println("********");
- one = (TestOne) cla.newInstance();// 产生这个Class类对象的一个实例,调用该类无参的构造方法,作用等同于new TestOne()
- } catch (Exception e) {
- e.printStackTrace();
- }
- TestOne two = new TestOne();
- System.out.println(one.getClass() == two.getClass());// 比较两个TestOne对象的Class对象是否是同一个对象,在这里结果是true。说明如果两个对象的类型相同,那么它们会有相同的Class对象
- }
- }
- class TestOne {
- static {
- System.out.println("静态代码块运行");
- }
- TestOne() {
- System.out.println("构造方法");
- }
- }
复制代码
代码分析:
在进行Class.forName("com.TestOne")的时候,实际上是对heima.TestOne进行类加载,这时候,会把静态属性、方法以及静态代码块都加载到内存中。所以这时候会打印出"静态代码块运行"。但这时候,对象却还没有产生。所以"构造方法"这几个字不会打印。当执行cla.newInstance()的时候,就是利用反射机制将Class对象生成一个该类的一个实例。这时候对象就产生了。所以打印"构造方法"。当执行到TestOnetwo=new TestOne()语句时,又生成了一个对象。但这时候类已经加载完毕,静态的东西已经加载到内存中,而静态代码块只执行一次,所以不用再去加载类,所以只会打印"构造方法",而"静态代码块运行"不会打印。
- package heima;
- import java.lang.reflect.Constructor;
- /**
- *本类测试反射获得类的构造器对象,
- *并通过类构造器对象生成该类的实例
- */
- public class Demo1 {
- public static void main(String[] args) {
- try {
- //获得指定字符串类对象
- Class cla=Class.forName("heima.Tests");
- //设置Class对象数组,用于指定构造方法类型
- Class[]cl=new Class[]{int.class,int.class};
- //获得Constructor构造器对象。并指定构造方法类型
- Constructor con=cla.getConstructor(cl);
- //给传入参数赋初值
- Object[]x={new Integer(1),new Integer(2)};
- //得到实例
- Object obj = con.newInstance(x);
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
- class Tests{
- public Tests(int x,int y){
- System.out.println(x+"....."+y);
- }
- }
复制代码
说明我们已经生成了Tests这个类的一个对象。
对于反射这部分内容理解的不是很好,结合网上某大神,试着分析你的疑问,写的不对的地方多多不吝赐教!
还有祝陈兄进入黑马的关键冲刺阶段顺利!{:soso_e100:} 静待佳音
|