Class类与反射

1.如果得到各个字节码对应的实例对象(Class类型)

类名.class,例如:System.class

对象.getClass,例如:new Date().getClass()

Class.forName("类名"),例如Class.forName("java.lang.String");

当对象未加载在虚拟机中,那么选择Class.forName("类名")进行加载字节码

2.反射就是把java类中的各种成分映射成相应的java类

Constructor类代表某个类中的一个构造方法

|-得到某个类所有的构造方法:

例子:Construtor[] construtors = Class.forName("java.lang.String").getConstrutors();

|-得到某一个构造方法:

例子:Construtor constructor = Class.forName("java.lang.String").getConstrutors("StringBuffer.class");

|-创建实例对象:

通常范式:String str = new String (new StringBuffer("abc"));

反射方式:String str = (String)construtor.getInstance(new StringBuffer("abc"));

|-Class.getInstance()方法:

例子:String obj = (String)Class.forName("java.lang.String").newInstance();

该方法内部先得得到默认的构造方法,然后用该构造方法创建实例对象

该方法内的具体代码是怎么写的呢?用到了缓存机制来保存默认构造方法的实例

成员变量的反射

Field类代表某个类中的一个成员变量

问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是对象关联,哪个关联的是哪个对象 呢?所以字段fieldX代表的是X的定义,而不是具体X变量

例子:

ReflectPoint point = new reflectPoint(1,7);

Field Y = Class.forName("ssss.ss.ReflectPoint").getField("Y");

System.out.println(Y.get(point));

成员方法的反射

Method类

Method类代表某个类中的一个成员方法

得到类中的某个方法:

例子:

Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);

调用方法:

通常方式:System.out.println(str.charAt(1));

反射方式:System.out.println(chartAt.invoke(str,1))

对接收数组参数的成员方法进行反射

写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调啊?
l问题:
启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传 递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法 时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以, main方法传递参数时,不能使用代码mainMethod.invoke(null,newString[]{“xxx”})javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5 语法解释,因此会出现参数类型不对的问题。
l解决办法:
mainMethod.invoke(null,new Object[]{newString[]{"xxx"}});
mainMethod.invoke(null,(Object)newString[]{"xxx"});,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了

我给你的数组,你不会当作参数,而是把其中的内容当作参数。

Classclazz = Class.forName(arg[0]);

MethodmMain = clazz.getMethod("main",String[].class);

mMain.invoke(null,newObject[]{newString[]{"aaa","bbb"}});

mMain.invoke(null,(Object)newString[]{"aaa","bbb"});

classTestArrayArguments {

publicstaticvoidmain(String [] args)

   {

   for(String arg:args)

   {

   System.out.println("----------"+ arg +"----------");

   }

   }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值