得到class的三种方式
- Class.forName("cn.bean.A");
- A.class;
- Thread.currentThread().getContextClassLoader().loadClass("cn.bean.A");
getFields()与getDeclaredFields()区别
getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.
getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
getMethods()与getDeclaredMethods()区别
getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法
getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
getConstructors()与getDeclaredConstructors()区别
getConstructors()只能访问类中声明为public的构造函数
getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关
实例化
Class clazz = Class.forName("Demo");
//通过带参数构造实例化
Demo demo = (Demo) clazz.getConstructor(String.class, Integer.class).newInstance("hello", 12);
clazz.getConstructor(new Class[]{String.class,Integer.class}).newInstance(new Object[]{"hello",12});
//默认空构造实例化
Demo demo1 = (Demo) clazz.newInstance();
System.out.println(demo.getName());
System.out.println(demo.getAge());
操作属性
Class clazz = Class.forName("Demo");
Demo demo = (Demo) clazz.newInstance();
Field name = clazz.getDeclaredField("name");
//允许访问私有变量
name.setAccessible(true);
name.set(demo , "hello world");
Object obj = name.get(demo);
System.out.println(obj);
操作方法
Class clazz = Class.forName("Demo");
Demo demo = (Demo) clazz.newInstance();
Method getName = clazz.getDeclaredMethod("getName");
Method setName = clazz.getDeclaredMethod("setName", String.class);
//val是method的返回值
Object val = setName.invoke(demo , "hello");
System.out.println(demo.getName());
System.out.println(val);