Java反射

    技术2022-07-11  81

    1.反射机制

    反射三种实现方式:

    package day27; import day17.Person; public class Dk1Reflect { //反射 public static void main(String[] args) throws ClassNotFoundException { //第一种方式 Class clazz1 = Class.forName("day17.Person"); //第二种方式字节码对象 Class clazz2 = Person.class; //第三种方式对象反向获取 Person p = new Person(); Class clazz3 = p.getClass(); //三种方式返回的是同一个字节码文件 System.out.println(clazz1 == clazz2); //结果为true System.out.println(clazz2 == clazz3); //结果为true } } package day27; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import day17.Person; public class Dk2Reflect { //配置文件代替原来的多态调用 public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Juicer j = new Juicer(); // j.run(new Apple()); // j.run(new Orange()); BufferedReader br = new BufferedReader(new FileReader("config.properties")); Class<?> clazz = Class.forName(br.readLine()); Fruit a = (Fruit)clazz.newInstance(); //创建该类的对象。通过类空参的构造 j.run(a); //配置文件是苹果,输出是榨苹果汁 //如果没有空参构造,就会抛出异常 //通过有参构造创建对象,config.properties改为Person类 Constructor<?> c = clazz.getConstructor(String.class,int.class); Person p = (Person)c.newInstance("张三",23); System.out.println(p); Field f = clazz.getField("name"); f.set(p, "李四"); System.out.println(p);//输出异常,因为name属性是私有的 //使用暴力获取字段 Field f2 = clazz.getDeclaredField("name"); f2.setAccessible(true); //去掉访问权限 f2.set(p, "李四"); System.out.println(p);//输出正常.李四,23 //获取方法 Method m = clazz.getMethod("eat"); //获取eat()方法 m.invoke(p); //执行eat()方法 Method m2 = clazz.getMethod("eat",int.class); //获取eat()方法有参 m.invoke(p,10); //执行eat()方法有参 } } interface Fruit{ public void squeeze(); } class Apple implements Fruit{ @Override public void squeeze() { System.out.println("榨出苹果汁"); } } class Orange implements Fruit{ @Override public void squeeze() { System.out.println("榨出橘子汁"); } } class Juicer{ public void run(Fruit f) { f.squeeze(); } }

    2.动态代理

    动态代理:本来自己做的事,请别人来做

    在程序运行过程中产生对象,通过反射产生一个代理

    只能针对接口做代理

    Processed: 0.013, SQL: 9