使用一个动态代理类(Proxy),通过拦截一个对象的行为并添加我们需要的功能来完成。Java中的java.lang.reflect.Proxy类 和java.lang.reflect.InvocationHandler接口为我们实现动态代理类提供了一个方案,但是该方案针对的对象要实现某些接 口;如果针对的目的是类的话,cglib为我们提供了另外一个实现方案。
一、接口的实现方案:
java 代码
- public interface StudentInfoService{
- void findInfo(String studentName);
- }
-
- public class StudentInfoServiceImpl implements StudentInfoService{
- public void findInfo(String name){
- System.out.println("你目前输入的名字是:"+name);
- }
- }
-
- import org.apache.log4j.Logger;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- import java.lang.reflect.Method;
-
- public class MyHandler implements InvocationHandler{
- private Object proxyObj;
- private static Logger log=Logger.getLogger(MyHandler.class);
-
- public Object bind(Object obj){
- this.proxyObj=obj;
- return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
- }
-
- public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
- Object result=null;
- try{
-
- log.info("调用log日志方法"+method.getName());
- result=method.invoke(proxyObj,args);
-
- }catch(Exception e){
- e.printStackTrace();
- }
- return result;
- }
- }
实现一个工厂,为了方便我们使用该拦截类(AOPFactory.java):
java 代码
- public class AOPFactory{
- private static Object getClassInstance(String clzName){
- Object obj=null;
- try{
- Class cls=Class.forName(clzName);
- obj=(Object)cls.newInstance();
- }catch(ClassNotFoundException cnfe){
- System.out.println("ClassNotFoundException:"+cnfe.getMessage());
- }catch(Exception e){
- e.printStackTrace();
- }
- return obj;
- }
-
- public static Object getAOPProxyedObject(String clzName){
- Object proxy=null;
- MyHandler handler=new MyHandler();
- Object obj=getClassInstance(clzName);
- if(obj!=null) {
- proxy=handler.bind(obj);
- }else{
- System.out.println("Can't get the proxyobj");
-
- }
- return proxy;
- }
- }
使用该工厂类
java 代码
- public class ClientTest{
- public static void main(String[] args){
- StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");
- studentInfo.findInfo("阿飞");
- }
- }
分享到:
相关推荐
动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy
首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写具体实现。这个新创建的代理类在运行时动态生成,并且在调用接口方法时,可以插入...
`Proxy`类是Java动态代理的核心,它提供了生成代理类和实例的静态方法。生成的代理类会实现目标类所实现的所有接口。`Proxy`类的主要方法有: - `Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, ...
【标题】:“JDBC Proxy 代理类” 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的主要方式。然而,直接使用JDBC代码往往繁琐且易出错,因此引入了代理类(Proxy Class)的概念,它能为JDBC提供更...
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
在Java的动态代理机制中,JDK生成的代理类之所以要继承`Proxy`类,是因为`Proxy`类提供了实现动态代理所需的核心功能。面试官的问题实际上涉及到Java动态代理的实现原理,下面我们将深入探讨这个问题。 首先,我们...
静态代理是在编译时就已经确定代理类的实现,而动态代理则是在运行时根据接口生成代理类。我们这里主要讨论的是动态代理,它基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 ...
在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...
总结起来,Java中的动态代理是AOP的一种实现方式,它利用`InvocationHandler`接口创建一个代理类,这个代理类可以在调用目标方法前后添加额外的功能,而无需修改目标类的源代码。这种机制在日志、事务管理、性能监控...
- `Proxy`类是Java提供的动态代理的工厂,它可以根据一个接口生成实现了该接口的代理类的对象。这个代理类会动态地生成并实现接口的所有方法。 - `InvocationHandler`接口定义了一个处理方法调用的回调方法`invoke...
在上面的示例中,我们定义了一个动态代理类DynamicProxy,它实现了InvocationHandler接口。我们可以通过DynamicProxy对象来代理RealSubject对象,并对其方法调用进行处理和修改。 四、结论 Java动态代理语法Proxy...
2. **Proxy**:提供了一系列静态方法来创建动态代理类和实例。 #### 四、Java动态代理示例 ```java interface MyInterface { void doSomething(); } class MyInvocationHandler implements InvocationHandler { ...
在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...
动态代理类是这种机制的一个变体,尤其适用于运行时生成代理类的情况。接下来,我们将详细讨论动态代理类的概念、其作用以及如何在实际开发中应用。 首先,代理类的主要作用在于提供额外的控制层。当直接调用目标...
首先,JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。JDK动态代理只能为实现了至少一个接口的类生成代理。它的基本原理是利用反射机制生成一个实现了目标接口的...
代理类在运行时由`java.lang.reflect.Proxy`类动态生成,因此称为动态代理。 2. CGLIB代理: 对于没有实现接口的目标对象,Spring会使用CGLIB库来创建代理。CGLIB是一个强大的高性能的代码生成库,它可以在运行期...
Java中提供了一个动态代理类Proxy,Proxy并不是我们上述所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance方法)来获取代理对象。 适配器模式是一种结构型模式,用于解决两个不兼容的...
动态代理,如JDK动态代理,提供了一种在运行时动态创建代理对象的能力,无需预先编写代理类。在Java中,我们可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于...
Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。这个主题将深入探讨这两个关键组件以及与之相关的CGLIB库。 ### 1. Java动态代理 #### 1.1 Proxy类 `Proxy`...