首先咱们要知道什么是类对象:类对象就是记录某个类本身的构造方法、属性、方法的对象。
1. 获取类对象的三种方式
Class.forName(‘完整类名‘)
类名.class
new 类名().getClass()
示例:用反射来创建一个新的对象。
package reflection; import java.lang.reflect.Constructor; import dealreflect.Hero; public class TestReflection { public static void main(String[] args) { try { //使用反射的方式创建对象 String className = "dealreflect.Hero"; //类对象 Class pClass=Class.forName(className); //构造器 Constructor c= pClass.getConstructor(); //通过构造器实例化 Hero h2= (Hero) c.newInstance(); h2.name="gareen"; System.out.println(h2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2. 反射类里面的方法
1.加载类 Class clazz = Class.forname("完整类名")
2.加载方法 Method method = clazz.getMethod("方法名",String.class,int.class(参数类型))
3.运行方法 method.invoke(类的实例,传参)
注意这儿得传类的实例,类对象是不行的。
反射main()方法
1.加载类 Class clazz = Class.forname("完整类名")
2.加载方法 Method method = clazz.getMethod("main",String[] args);
3.运行方法,比较奇怪 method.invoke(null,new Object[](new String[]{"aa","bb"})) 或者 method.invoke(null, Object(new String[]{"aa","bb"}))
因为在往主函数里传String数组的时候,程序会自己拆分成String a1,String a2
3. 反射类里面的字段
1.加载类 Class clazz = Class.forname("完整类名")
[clazz.setAccessible(true)] 进行暴力反射,就可以拿到private属性或方法的值了。
2.加载字段 Field f = clazz.getField("字段名")
备注:getField和getDeclaredField的区别
这两个方法都是用于获取字段
getField 只能获取public的,包括从父类继承来的字段。
3.获得字段的值
String name = (Stirng) f.get(p)
或者 Object value = f.get(p)
4.获取字段的类型
Class type = f.getType();
5.设置字段的值
f.set(p,"xxxxxxxx")