版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/82353211
特此说明:本文参考传智播客、黑马程序员视频讲座 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
类加载器
public static void main(String[] args) {
//获得Demo字节码文件的类加载器
Class clazz = Demo.class;//获得Demo的字节码对象
ClassLoader classLoader = clazz.getClassLoader();//获得类加载器
//getResource的参数路径相对classes(src)
//获得classes(src)下的任何的资源
String path = classLoader.getResource("com/itheima/classloader/jdbc.properties").getPath();
//classLoader.getResourceAsStream("");
System.out.println(path);
}
动态代理
TargetInterface.java
package dynamicProxy;
public interface TargetInterface {
public void method1() ;
public String method2(String string);
}
TargetInterface.java
package dynamicProxy;
public class Target implements TargetInterface{
public void method1() {
System.out.println("I am method_1...");
}
public String method2(String string) {
System.out.println("I am method_2...");
return string;
}
}
ProxyTest .java
package dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class ProxyTest {
@Test
public void test() {
//获得动态代理对象---在运行时内存中为Target创建一个虚拟的代理对象
TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance(
Target.class.getClassLoader(), //目标对象类加载器
new Class[] {TargetInterface.class}, //接口的字节码数组
new InvocationHandler() { //新建接口(匿名内部类)
//method内部封装了目标对象的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用方法前的处理代码。。。");
//执行目标对象的方法
String string = (String) method.invoke(new Target(), args);
System.out.println("调用方法后的处理代码..."+string);
return null;
}
}
);
//调用虚拟代理对象的方法,他会调用invoke
objProxy.method1();
objProxy.method2("method_2");
}
}
结果打印
调用方法前的处理代码。。。
I am method_1…
调用方法后的处理代码…null
调用方法前的处理代码。。。
I am method_2…
调用方法后的处理代码…method_2