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.动态代理
动态代理:本来自己做的事,请别人来做
在程序运行过程中产生对象,通过反射产生一个代理
只能针对接口做代理