1、方式一:调用类中的public修饰的无参构造器
2、方式二:调用类中的指定构造器
3、Class类相关方法
newInstance:调用类中的无参构造器,获取对应类的对象
getConstructor( Class...clazz ):根据参数列表,获取对应的构造器对象
getDecalaredConstructor( Class...clazz):根据参数列表,获取对应的构造器对象
4、Constructor类相关方法
setAccessible:暴破
newInstance(Object...obj):调用构造器
- public class ReflectCreateInstance {
- public static void main(String[] args) throws Exception{
- //先获取到User类的Class对象
- Class> userClass = Class.forName("reflection_.User");
- //通过public的无参构造器创建实例
- Object o = userClass.newInstance();
- System.out.println(o);
- //通过public的有参构造器创建实例
- Object jack = userClass.getConstructor(String.class).newInstance("jack");
- System.out.println(jack);
- //通过非public的有参构造器创建实例
- //得到private的构造器对象
- Constructor> declaredConstructor = userClass.getDeclaredConstructor(String.class, int.class);
- declaredConstructor.setAccessible(true);//使用反射可以访问private构造器
- Object milan = declaredConstructor.newInstance("milan", 20);
- System.out.println(milan);
- }
- }
- class User{
- private String name;
- private int age;
- public User(){}
-
- public User(String name) {
- this.name = name;
- }
-
- private User(String name, int age){
- this.age=age;
- this.name=name;
- }
- @Override
- public String toString() {
- return "User{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
1.根据属性名获取Field对象
Field field = class对象.getDeclaredField(属性名)
2.暴破:f.setAccessible(true)
3.访问
f.set(o,值)
syso(f.get(o))
4.如果是静态属性,则set和get中的参数o,可以写成null
- public class ReflectAccessProperty {
- public static void main(String[] args) throws Exception{
- Class> studentClass = Class.forName("reflection_.Student");
- Object o = studentClass.newInstance();
- Field age = studentClass.getDeclaredField("age");
- age.set(o,20);//通过反射设置属性的值
- System.out.println(o);
- System.out.println(age.get(o));
- //操作静态属性
- Field name = studentClass.getDeclaredField("name");
- name.setAccessible(true);
- name.set(o,"jack");
- System.out.println(o);
- System.out.println(name.get(null));
- }
- }
- class Student{
- private static String name;
- public int age;
- public Student(){}
- @Override
- public String toString() {
- return "Student{" +
- "age=" + age +
- '}';
- }
- }
1.根据方法名和参数列表获取Method方法对象:
Method m = clazz.getDeclaredMethod(方法名,XX.class);
2.获取对象:Object o = claszz.newInstance();
3.暴破:m.setAccessible(true)
4.访问:Object returnValue = m.invoke(o,实参列表)
5.注意:如果是静态方法,则invoke的参数o,可以写成null
- public class ReflectMethod {
- public static void main(String[] args) throws Exception{
- Class> bossClass = Class.forName("reflection_.Boss");
- Object o = bossClass.newInstance();
- Method hi = bossClass.getMethod("hi", String.class);
- hi.invoke(o,"hello");
- //操作静态方法
- Method say = bossClass.getDeclaredMethod("say", int.class, String.class, char.class);
- say.setAccessible(true);
- System.out.println(say.invoke(o,20,"jack",'c'));
-
- }
- }
- class Boss{
- public int age;
- private static String name;
-
- public Boss() {}
- private static String say(int n,String s,char c){
- return n+" "+s+" "+c;
- }
- public void hi(String s){
- System.out.println(s);
- }
- }