51_52创建动态类的实例对象及调用其方法

简介: package com.itcast.day3; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.
package com.itcast.day3;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
/*
 * 三种得到代理类对象的方式
 * 一、直观型
 * 二、匿名内部类型
 * 三、从字节码一步到位型(推荐使用)
 */
public class ProxyTest {
    public static void main(String[] args)throws Exception {
        //得到代理类的字节码
        Class clazzProxy1=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
        //clazzProxy1.newInstance();//不能这么干,因为该newInstance调用的是那个不带参数的构造方法
        
        /**一、最直观的方式创建代理类对象***/
        //01.得到有参数的构造方法
        System.out.println("begin create instance");
        Constructor constructor=clazzProxy1.getConstructor(InvocationHandler.class);
        //newInstance时要有InvocationHandler实例,但是InvocationHandler是一个接口,所以定义了这个类
        class InvocationHandlerImpl_1 implements InvocationHandler{

            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                // TODO Auto-generated method stub
                return null;
            }
            
        }
        //02.得到实例对象
        Collection proxy1=(Collection) constructor.newInstance(new InvocationHandlerImpl_1());
        System.out.println(proxy1.toString());//
        proxy1.clear();//无返回值函数
        //proxy1.size();//有返回值函数--报空指针--没有目标类
        
        
        /**二、使用匿名内部类得到代理类对象****/
        Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                
                return null;
            }
        });
        
        
        /**三、一步到位得到代理类对象****/
        Collection proxy3 =  (Collection)Proxy.newProxyInstance(
                Collection.class.getClassLoader(), 
                new Class[]{Collection.class}, 
                new InvocationHandler(){
                    ArrayList target=new ArrayList();
                    @Override
                    public Object invoke(Object proxy, Method method,
                            Object[] args) throws Throwable {
                        
                        long beginTime=System.currentTimeMillis();
                        Object reVal=method.invoke(target, args);
                        long endTime=System.currentTimeMillis();
                        System.out.println(method.getName()+" running "+(endTime-beginTime));
                        return reVal;
                    }
                }
            );
        
        proxy3.add("123");
        proxy3.add("456");
        System.out.println(proxy3.size());
        
        System.out.println(proxy3.getClass().getName());//com.sun.proxy.$Proxy0,为什么不是ArrayList?
        //原因 Object没有把所有的方法都派发给 代理类构造方法的参数---InvocationHandler来处理
        
        /* java.lang.reflect.Proxy API
        在代理实例上的 java.lang.Object 中声明的 hashCode、equals 或 toString 方法的调用将按照与编码
        和指派接口方法调用相同的方式进行编码,并被指派到调用处理程序的 invoke 方法,如上所述。
        传递到 invoke 的 Method 对象的声明类是 java.lang.Object。
        代理类不重写从 java.lang.Object 继承的代理实例的其他公共方法,
        所以这些方法的调用行为与其对 java.lang.Object 实例的操作一样。 */

    }
}
开始做,坚持做,重复做
相关文章
|
5月前
|
编译器 C++
46 C++ - 非自动继承的函数
46 C++ - 非自动继承的函数
19 0
|
2月前
|
前端开发 算法 JavaScript
检查是否是类的对象实例
检查是否是类的对象实例
16 0
|
Java 编译器
创建一个对象的时候
创建一个对象的时候
57 0
|
Python
5 类的创建及使用
5 类的创建及使用
107 0
|
设计模式
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
|
JavaScript 前端开发 Java
创建Class类的实例对象的三种方法
创建Class类的实例对象的三种方法
202 0
|
缓存 安全 Java
仅且仅创建一次对象
此篇算是对《voliatile,synchronized,cas》理论的一种实践
117 0
|
Java
类于对象及静态与实例
类与对象:                类,有分类的意思并 、不是一个对象就一个类,发现他们的共同属性和方法,集合在一起,申请一个类。                对象的模板、一个类可以产生很多个对象                对象是虚拟的,要想在代码中实现出来就必须申请类 类的声明举例:...
982 0
2-1 类的创建
创建一个简单的表示矩形的Rectangle类,满足以下条件: 1、定义两个成员变量height和width,表示矩形的长和宽,类型为整型 2、定义一个getArea方法,返回矩形的面积 3、定义一个getPerimeter...
1020 0
类中静态方法的调用,根据传入值生成不同类但同一个接口对象,调用其中实现的接口的方法.
实现同一个接口的不同的类,根据调用总和类中静态类型(返回值同接口)方法,(传入不同值),根据if else判定该new哪一个实现类.从而使用不同的接口的实现方法.  将编程看作是一门艺术,而不单单是个技术。
1084 0

热门文章

最新文章