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))
对接收数组参数的成员方法进行反射
我给你的数组,你不会当作参数,而是把其中的内容当作参数。
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 +"----------");
}
}
}