WEB_25【类加载器,动态代理】

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/82353211