反射

mac2024-02-20  34

package dong.jie; public class Person { private String name; int age; public String address; public Person() { } private Person(String name) { this.name = name; } Person(String name, int age) { this.name = name; this.age = age; } public Person(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } public void show() { System.out.println("show"); } public void method(String s) { System.out.println("method " + s); } public String getString(String s, int i) { return s + "---" + i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }

1.创建class对象,并且通过反射获取无参构造方法的使用

Class.forName(“dong.jie.ReflectDemo”);里面必须是包含所有的包名

package dong.jie; import java.lang.reflect.Constructor; public class ReflectDemo { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //创建一个class对象, Class c=Class.forName("dong.jie.ReflectDemo"); //返回构造器对象,obj对象相当于person的对象 Constructor con=c.getConstructor(); Object obj=con.newInstance(); System.out.println(obj); } }

2.通过反射获取带参构造方法的使用 3.通过反射对私有构造方法的访问 4.通过反射获取成员变量并使用

package dong.jie; import java.lang.reflect.Constructor; import java.lang.reflect.Field; /* * 通过反射获取成员变量并使用 */ public class ReflectDemo03 { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class c = Class.forName("dong.jie.Person"); // 获取公共的public成员变量 // Field[] fields = c.getFields(); //获取所有的成员变量值 // Field[] fields2=c.getDeclaredFields(); // for(Field field:fields2) { // System.out.println(field); // // } //通过无参构造创建对象 Constructor con=c.getConstructor(); Object obj=con.newInstance(); //获取公有的public,单个成员变量,address Field adressField=c.getField("address"); //将他设置为新的值 adressField.set(obj, "北京"); System.out.println(obj); //再获取私有的单个成员变量,name Field nameField=c.getDeclaredField("name"); //java.lang.IllegalAccessException //因为name是私有的,所以要进行暴力访问 nameField.setAccessible(true); //暴力访问 nameField.set(obj, "张飞"); System.out.println(obj); } }

5.通过反射获取无参无返回值的方法并使用

package dong.jie; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectDemo02 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //创建一个class对象 Class c=Class.forName("dong.jie.Person"); //获取自己和父亲的所有的公有的方法 Method[] methods=c.getMethods(); //只获取自己的所有的方法 Method[] methods2=c.getDeclaredMethods(); for(Method method:methods2) { System.out.println(method); } //通过无参来创建对象,obj相当于person的对象 Constructor con=c.getConstructor(); Object obj=con.newInstance(); //获取这个方法 // public void show() //获取单个方法并使用 // public Method getMethod(String name,Class<?>... parameterTypes) // 第一个参数表示方法名,第二个参数表示方法的参数 的class类型 Method method=c.getMethod("show"); // public Object invoke(Object obj,Object... args) //第一个参数对象是谁,第二个参数该方法的实际的参数 Object object=method.invoke(obj); //获取带参带返回值方法并使用 // public void method(String s) Method method2=c.getMethod("method", String.class); Object object2=method2.invoke(obj, "hello"); //获取带参带返回值方法并使用 // public String getString(String s, int i) Method method3=c.getMethod("getString", String.class,int.class); Object object3=method3.invoke(obj, "李白",55); System.out.println(object3.toString()); //private void function() //获取私有的方法 Method method4=c.getDeclaredMethod("function"); //暴力访问 method4.setAccessible(true); method4.invoke(obj); } }

6.通过反射在ArrayList 类型的集合中添加String类型的元素

package dong.jie; import java.lang.reflect.Method; import java.util.ArrayList; //通过反射在ArrayList<Inter> 类型的集合中添加String类型的元素 public class ReflectDemo05 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub ArrayList<Integer> al=new ArrayList(); //集合arraylist集合的class文件对象 Class c=al.getClass(); Method method=c.getMethod("add",Object.class); method.invoke(al, "我是蔡徐坤"); method.invoke(al, "李白"); method.invoke(al, 5); method.invoke(al, 5.2); System.out.println(al); } }

7.创建动态代理对象和使用

package user; public interface StudentDao { public abstract void login(); public abstract void regist(); } package user; public class StudentDaoImple implements StudentDao { @Override public void login() { System.out.println("登录功能"); } @Override public void regist() { System.out.println("注册功能"); } } package user; /* * 用户操作接口 */ public interface UserDao { public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void find(); } package user; public class UserDaoImple implements UserDao { @Override public void add() { System.out.println("添加功能"); } @Override public void delete() { System.out.println("删除功能"); } @Override public void update() { System.out.println("修改功能"); } @Override public void find() { System.out.println("查找功能"); } }

下面是核心代码

package user; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInnovationHandler implements InvocationHandler{ //目标对象 private Object target; public MyInnovationHandler(Object target) { super(); this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("权限校验"); Object result=method.invoke(target, args); System.out.println("日志记录"); //返回的是代理对象 return result; } }

下面是核心代码

package user; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub UserDao ud = new UserDaoImple(); ud.add(); ud.delete(); ud.update(); ud.find(); System.out.println("--------------------"); //创建动态代理对象,Proxy类中的方法:创建动态代理对象 //public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, // InvocationHandler h) // 把ud作为代理对象 MyInnovationHandler mih = new MyInnovationHandler(ud); UserDao proxy=(UserDao)Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), mih); proxy.add(); proxy.delete(); proxy.find(); proxy.update(); System.out.println("--------------------"); StudentDao sd=new StudentDaoImple(); sd.login(); sd.regist(); System.out.println("--------------------"); //将sd作为代理对象 MyInnovationHandler mih2=new MyInnovationHandler(sd); StudentDao proxy2=(StudentDao)Proxy.newProxyInstance(sd.getClass().getClassLoader(), sd.getClass().getInterfaces(),mih2); proxy2.login(); proxy2.regist(); } }
最新回复(0)