1.通过反射创建对象
我们分三种情况进行讨论:🎈
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * 反射爆破案例,创建实例 */ public class ReflectionBlast { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { // 获取User类的Class对象 Class<?> userClass = Class.forName("reflection.User"); // 通过public的无参构造器创建实例 Object o = userClass.newInstance(); System.out.println(o); // User{age=21, name='dahe'} // 通过public的有参构造器创建实例 Constructor<?> constructor = userClass.getConstructor(String.class); Object ww = constructor.newInstance("王伟"); System.out.println(ww); // User{age=21, name='王伟'} // 通过非public的有参构造器创建实例 Constructor<?> declaredConstructor = userClass.getDeclaredConstructor(int.class, String.class); // 开启爆破模式 declaredConstructor.setAccessible(true); Object ddd = declaredConstructor.newInstance(12, "ddd"); System.out.println(ddd); // User{age=12, name='ddd'} } } class User { private int age = 21; private String name = "dahe"; public User() { } public User(String name) { this.name = name; } private User(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\'' + '}'; } }
2.通过反射爆破属性
我们分两种情况进行讨论:🙌
import java.lang.reflect.Field; /** * 反射爆破案例,爆破属性 */ public class ReflectionBlastAttributes { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException { Class<?> stuClass = Class.forName("reflection.Student"); // 创建一个对象 Object o = stuClass.newInstance(); Field age = stuClass.getField("age"); // 操作公有属性 age.set(o, 99); System.out.println(o); // Student{age=99 name=null} // 操作私有静态属性 Field name = stuClass.getDeclaredField("name"); name.setAccessible(true); // 也可以写为name.set(null, "昆仑云"); name.set(o, "昆仑云"); System.out.println(o); // Student{age=99 name=昆仑云} // 得到某一个属性 System.out.println(age.get(o)); // 99 System.out.println(name.get(null)); // 昆仑云 } } class Student { public int age; private static String name; public Student() { } @Override public String toString() { return "Student{" + "age=" + age + "\tname=" + name + '}'; } }
3.反射爆破方法
我们分两种情况进行讨论:🎍
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射爆破案例,爆破方法 */ public class ReflectionBlastMethod { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class<?> bossClass = Class.forName("reflection.Boss"); Object o = bossClass.newInstance(); // 反射爆破公有方法 Method hi = bossClass.getMethod("hi", String.class); hi.invoke(o, "dahedahe"); // dahedahe // 反射爆破私有静态方法 Method say = bossClass.getDeclaredMethod("say", int.class, String.class, char.class); say.setAccessible(true); System.out.println(say.invoke(o, 12, "我的司机", 'a')); // 12 我的司机 a } } 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); } }
在反射中,如果方法有返回值,统一返回为Object
类型🎶