ClassLoadTest .java
package ZHANG.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
public class ClassLoadTest {
/**
* @param args
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
System.out.println(clazz.getName());
Constructor[] constructors = clazz.getConstructors();
for(Constructor constructor : constructors){
String name = constructor.getName();
StringBuilder sb = new StringBuilder(name);
sb.append('(');
Class[] classparams = constructor.getParameterTypes();
for(Class classparam : classparams){
sb.append(classparam.getName()).append(',');
}
if(constructors!=null && classparams.length!=-1)
sb.deleteCharAt(sb.length()-1);
sb.append(')');
System.out.println(name);
}
System.out.println("------------------------method list");
Method[] Methods = clazz.getMethods();
for(Method constructor : Methods){
String name = constructor.getName();
StringBuilder sb = new StringBuilder(name);
sb.append('(');
Class[] classparams = constructor.getParameterTypes();
for(Class classparam : classparams){
sb.append(classparam.getName()).append(',');
}
if(constructors!=null && classparams.length!=-1)
sb.deleteCharAt(sb.length()-1);
sb.append(')');
System.out.println(name);
}
//第一种方式
Constructor constructor = clazz.getConstructor(InvocationHandler.class);
class MyInvocationHandler implements InvocationHandler{
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
}
Collection proxy1 = (Collection) constructor.newInstance(new MyInvocationHandler());
System.out.println(proxy1.toString());
proxy1.clear();
//proxy1.size();
//第二种
Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
});
//第三种 proxy与实例对象合二为一
Collection proxy3 = (Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler(){
ArrayList target = new ArrayList();//放在Invoke里每次调用会返回0,放外面是成员变量了
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
long begintime = System.currentTimeMillis();
Object retVal = method.invoke(target, args);
long endtime = System.currentTimeMillis();
System.out.println("runnig time = "+(begintime-endtime));
return retVal;
}
});
proxy3.add("xyz");
proxy3.add("yuws");
proxy3.add("haha");
System.out.println(proxy3.size());
}
}
转载于:https://my.oschina.net/u/175434/blog/699981
分享到:
相关推荐
在"JAVA反射与代理"这个主题中,我们将深入探讨这两个核心概念。 首先,让我们了解反射的基本用法。当一个类的名称在运行时才被知道,反射可以帮助我们动态地创建对象。例如,我们可以使用`Class.forName()`方法...
### Java反射与代理实现AOP #### 一、AOP概念及应用场景 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想和技术,主要用于处理横切关注点问题,比如日志记录、性能统计、安全控制、事务处理、...
利用 Java 的反射与代理实现 AOP AOP(Aspect Oriented Programming),即面向切面编程,是一种新的编程思想,它主要用于日志记录、性能统计、安全控制、事务处理、异常处理等方面。其主要意图是将日志记录、性能...
Java编程思想第十四章类型信息之反射与代理.pptx
Java的反射和代理机制是两种强大的工具,它们在实现控制反转(Inversion of Control,简称IOC)模式中扮演着重要角色。IOC模式是一种设计模式,它将对象的创建和依赖关系的管理从代码中分离出来,使系统更加灵活、可...
总结来说,通过Java的反射和动态代理,我们可以轻松地实现AOP,将日志记录等横切关注点与业务逻辑解耦。这种设计模式在大型复杂应用中尤为有用,因为它允许我们以灵活的方式管理横切关注点,而无需修改大量业务代码...
`JAVA反射与代理.ppt`可能包含对这两个主题的深入讲解,包括理论知识、代码示例和实际应用场景。学习这个PPT可以帮助你更好地理解代理和反射在实际项目中的运用,例如AOP(面向切面编程)、动态数据绑定、插件机制、...
本主题将深入探讨JVM技术,特别是反射与动态代理这两个关键特性。 一、JVM技术 1. 类加载机制:JVM通过类加载器(ClassLoader)来加载.class文件,分为启动类加载器、扩展类加载器和应用程序类加载器。类的加载...
1.技术博客汇总 2.开源项目汇总 3.生活博客汇总 4.喜马拉雅音频汇总 5.其他汇总
Java反射是Java编程语言中的一个强大特性,...但需要注意的是,过度使用反射和动态代理可能会带来性能损失,因为它们都需要在运行时解析类信息,增加了额外的开销。因此,在实际开发中应适度使用,以平衡功能性和性能。
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...
主要给大家介绍了如何通过5分钟快速看懂ES6中的反射与代理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ES6具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
3. **反射机制**:在AOP动态代理中,反射机制扮演着重要角色。通过反射,我们可以动态获取类的信息,包括类的字段、方法等,并能够在运行时动态地调用方法。在创建代理对象和处理方法调用时,都会用到反射。 4. **...
Java 反射实现的 AOP(面向切面编程)动态代理模式是 Spring 框架中 AOP 实现的核心机制之一。AOP 是一种编程范式,它关注于程序执行过程中的“切面”,即跨越多个对象的行为或关注点,如日志、事务管理等。在传统的...