------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
(2)如何获取字节码文件对象:
A:通过Object类的getClass()方法。
B:通过数据类型的class静态属性。
C:通过Class类的静态方法forName()。
(3)反射获取操作:
A:通过反射获取构造方法并使用。
通过构造方法对象创建对象。
B:通过反射获取成员变量并使用。
通过成员变量对象给成员变量赋值。
C:通过反射获取成员方法并使用。
通过成员方法对象调用成员方法。
(4)暴力反射:取消访问权限检查
public static void main(String[] args) {
// 创建被代理的对象
MyProxyClass mpc = new MyProxyClass();
// 创建InvocationHandler对象,负责具体的代理执行
MyHandler mh = new MyHandler(mpc);
// 创建代理对象,将代理对象转成被代理对象的类型。
MyInterface newProxyInstance = (MyInterface)Proxy.newProxyInstance(mpc.getClass()
.getClassLoader(), mpc.getClass().getInterfaces(), mh);
// 代理对象 代理 被代理对象 执行的方法
newProxyInstance.eat();
int sleep = newProxyInstance.sleep(4);
System.out.println(sleep);
//1:创建被代理对象
MyProxyClass mpc2 = new MyProxyClass();
//2:创建代理对象
//2-1:定义InvocationHandler类,实现invoke方法的过程
//2-2 : 创建InvocationHandler对象,负责具体的代理执行,将被代理对象作为构造方法参数传入
MyHandler mh2 = new MyHandler(mpc2);
//2-3:创建代理对象,将代理对象转成被代理对象的类型。注意强转成该实例对象实现的接口类型,从而具备该接口的方法
MyInterface newProxyInstance2 = (MyInterface)Proxy.newProxyInstance(mpc.getClass()
.getClassLoader(), mpc.getClass().getInterfaces(), mh2);
//3:代理对象 代理 被代理对象 执行的方法
newProxyInstance2.eat();
int sleep2 = newProxyInstance2.sleep(4);
System.out.println(sleep2);
}
public abstract class Test {
FileReader fr;
public Test(FileReader fr) {
super();
this.fr = fr;
}
public static void main(String[] args) {
Frame fram = new Frame();
fram.addWindowListener(new WindowAdapter() {
});
}
public void firstPart(){
System.out.println("完成准备动作");
}
//真正执行的代码
public abstract void middlePart();
public void lastPart(){
System.out.println("完成首尾动作");
}
}
public interface MyInterface {
public abstract void eat();
public abstract int sleep(int number);
}
public class MyProxyClass implements MyInterface {
@Override
public void eat() {
System.out.println("吃了");
}
@Override
public int sleep(int number) {
System.out.println("我睡了");
return number;
}
}
public class MyHandler implements InvocationHandler {
//传入具体执行的被代理的对象
MyInterface mi;
public MyHandler(MyInterface mi) {
super();
this.mi = mi;
}
//method:动态代理的那个方法
//args:方法的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("我是加强的功能");
//通过反射完成被代理对象,被代理方法的执行
Object result = method.invoke(mi, args);
System.out.println("我是加强的功能");
//返回该方法的返回值
return result;
}
}