/*
public class ReflectDome {
public static void main(String[] args) {
try {
/*
* 反射基础 Class类(反射的入口:java.lang.Class)
* 调用静态方法 Class.forName("全类名") 初始化(加载这个类)
* */
Class<?> classzz=Class.forName("entity.User");
/*
* new与newInstance区别
* 作用都是实例化
* newInstance 是将 new 分为两步
* 1. 调用 Class.fromName() 加载类
* 2. 进行实例化
* 当使用 newInstance时 这个类必须被加载了 也就是说 在jvm内存空间中必须有 了对象存在
* 而使用 new 这个类可以没有加载 只有当调用时 对象 才在内存空间中开辟出来
* 一
* new 是强类型
* newInstance 是弱类型 Object
* 二
* new 可以调用类的任意构造
* newInstance 只能调用无参构造 调用有参构造 会抛异常
*
* newInstance 好处 工厂模式 单例模式 常用
* 对代码解耦
* Class.forName("xx") 这里可以从配置文件中获取
* */
Object obj=classzz.newInstance();
* 获取属性
* java.lang.class类下方法
* getFields() 只能获得公共属性 包括父类
* getgetDeclaredFields 获取本类所有方法
* */
Field [] fp=classzz.getFields();
//获取 h 属性
Field ff=classzz.getField("i");
//设置属性
ff.set(obj, 2);
//set get user.i 并没有这两个方法 但是 set 和 get 继承Object
System.out.println(ff.get(obj));
for(Field f:fp) {
System.out.println(f);
}
System.out.println("______________________________________");
Field [] fprivate =classzz.getDeclaredFields();
Field fprs= classzz.getDeclaredField("pwd");
fprs.setAccessible(true);
fprs.set(obj, "vvvv");
Field fpr= classzz.getDeclaredField("name");
fpr.setAccessible(true);//对私有字段的访问取消检查
fpr.set(obj, "老王");
System.out.println(fpr.get(obj)+""+fprs.get(obj));
for(Field f:fprivate) {
System.out.println(f);
}
System.out.println("______________________________________");
/*
*调用方法
*getDeclaredMethods() 获得本类所有的方法
*getMethods() 获取包括父类所有的公共方法
*获得指定方法(对象) setName方法名 String.class参数类型
*Method m=classzz.getDeclaredMethod("setName", String.class);
*invoke() 回调方法
*通过获得指定的方法 对象 m 来回调方法
*m.invoke(obj,value) obj回掉方法所属的类 value 赋值
* */
Method [] mm=classzz.getMethods();
Method [] men=classzz.getDeclaredMethods();
Method m=classzz.getDeclaredMethod("setName", String.class);
m.invoke(obj, "123");
Method ms=classzz.getDeclaredMethod("setert", String.class);
ms.setAccessible(true);
ms.invoke(obj, "WWWW");
System.out.println(obj);
//m.invoke(obj, args)
for(Method me:men) {
System.out.println(me);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}