- package proxy;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.util.Collection;
- public class ProxyTest {
- /**
- * @param args
- * ★要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,
- * 全部采用静态代理方式,将是一件非常麻烦的事情!写成百上千个代理
- * 类会很累
- * ★JVM可以在巡行期动态生成出类的字节码,这种动态生成的类往往被
- * 用作代理类,即动态代理类,
- * ★JVM身材的动态类必须实现一个或多个接口,所以,JVM生成的动态类
- * 只能用作具有相同接口的目标类的代理
- * ★CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的
- * 代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以
- * 使用CGLIB库
- * ★代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回
- * 的结果外,还可以在代理方法中的如下四个位置加上系统功能代码
- * 》1、在调用目标方法之前
- * 》2、在调用目标方法之后
- * 》3、在调用目标方法前后
- * 》5、在处理目标方法异常的catch中
- */
- public static void main(String[] args)throws Exception {
- // TODO Auto-generated method stub
-
- Class clazzProxy1=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class.getInterfaces());
- System.out.println(clazzProxy1.getName());
-
- System.out.println("-----------begin constructor list---------------");
- /* $Proxy0[]
- $Proxy0[](InvocationHandler,int)*/
- Constructor[] constructors=clazzProxy1.getConstructors();
- for(Constructor constructor :constructors){
- String name=constructor.getName();
- StringBuilder sBuilder=new StringBuilder(name);
- sBuilder.append('(');
- Class[] clazzParams=constructor.getParameterTypes();
- for(Class clazzParam:clazzParams)
- sBuilder.append(clazzParam.getName()).append(',');
- if(clazzParams.length!=0&&clazzParams!=null)
- sBuilder.deleteCharAt(sBuilder.length()-1);
- sBuilder.append(')');
- System.out.println(sBuilder);
- }
-
- System.out.println("-----------begin method list---------------");
- /* $Proxy0[]
- $Proxy0[](InvocationHandler,int)*/
- Method[] methods=clazzProxy1.getMethods();
- for(Method method :methods){
- String name=method.getName();
- StringBuilder sBuilder=new StringBuilder(name);
- sBuilder.append('(');
- Class[] clazzParams=method.getParameterTypes();
- for(Class clazzParam:clazzParams)
- sBuilder.append(clazzParam.getName()).append(',');
- if(clazzParams.length!=0&&clazzParams!=null)
- sBuilder.deleteCharAt(sBuilder.length()-1);
- sBuilder.append(')');
- System.out.println(sBuilder);
- }
-
- System.out.println("-----------begin create instance list---------------");
- Constructor constructor=clazzProxy1.getConstructor(InvocationHandler.class);
- class MyInvocationHandler1 implements InvocationHandler{
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- // TODO Auto-generated method stub
- return null;
- }
-
- }
- Collection proxy1=(Collection)constructor.newInstance(new MyInvocationHandler1());
- System.out.println(proxy1.toString());
- }
- }
复制代码 代码如上:
运行结果如下:
$Proxy0
-----------begin constructor list---------------
$Proxy0(java.lang.reflect.InvocationHandler)
-----------begin method list---------------
hashCode()
equals(java.lang.Object)
toString()
iterator()
isProxyClass(java.lang.Class)
getProxyClass(java.lang.ClassLoader,[Ljava.lang.Class;)
getInvocationHandler(java.lang.Object)
newProxyInstance(java.lang.ClassLoader,[Ljava.lang.Class;,java.lang.reflect.InvocationHandler)
wait()
wait(long,int)
wait(long)
getClass()
notify()
notifyAll()
-----------begin create instance list---------------
Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to java.util.Collection
at proxy.ProxyTest.main(ProxyTest.java:83)
代理可以实现强转啊,代码和老师写的差不多,为什么会无法实现强转呢?求解!
还有 哪位大神 给我讲讲动态代理类,和InvocationHandler这个接口,听得有点晕!
|