java中静态导入机制用法实例详解

java 代理体制的实例详解

动态代理的兑现

java动态代理类能够分成三种。

java中静态导入机制用法实例详解

前言:

采纳的方式:代理格局。

静态代理:由技师制造或一定工具自动生王炯代码,再对其编写翻译。在程序运维前,代理类的.class文件就已经存在了。

             这里主要助教了如何采纳Java中静态机制的用法,这里提供了简短实例我们能够参见下。

 java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理三种,在运维时生成新的子类class文件。本文首要练习下动态代理,代码用于备忘。对于代理的规律和机制,互联网有很多写的很好的,就不布鼓雷门了。

代办方式的职能是:为别的对象提供壹种代理以决定对这些指标的拜会。类似租房的中介。

动态代理:在程序运营时,运用反射机制动态创立而成。

静态常量类

jdk代理

二种动态代理:

1、首先大家进行java动态代理的言传身教。

在java开拓中,大家会平时用到一些静态常量用于状态推断等操作。为了能够在四个地点复用那些常量,常常每一种模块都会加二个常量类,举个大约的列子:

实例代码

(1)jdk动态代理,jdk动态代理是由Java内部的反光机制来落到实处的,指标类基于统一的接口(InvocationHandler)

于今我们有一个简约的政工接口Saying,如下:

import com.sky.OrderMouleConsstants; 

/** 
 * Created by gantianxing on 2017/4/21. 
 */ 
public class Test { 
  public void main() { 
    int orderState = orderService.getOrderState(id); 
    if(OrderMouleConsstants.SUCCESS == orderState){ 
      //订单成功状态逻辑 
    } 
    if(OrderMouleConsstants.FAIL == orderState){ 
      //订单失败状态逻辑 
    } 
  } 
} 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 

public class ProxyFactory implements InvocationHandler {  

  private Object tarjectObject;  

  public Object creatProxyInstance(Object obj) {  
    this.tarjectObject = obj; 
    return Proxy.newProxyInstance(this.tarjectObject.getClass()  
        .getClassLoader(), this.tarjectObject.getClass()  
        .getInterfaces(), this);  
  }  

  @Override  
  public Object invoke(Object proxy, Method method, Object[] args)  
      throws Throwable {  
    Object result = null;  
    if (AssessUtils.isAssess()) {  
      result = method.invoke(this.tarjectObject, args);  
    }else{ 
      throw new NoAssessException("This server cannot run this service."); 
    } 
    return result;  
  } 
} 

(二)cglib动态代理,cglib动态代理底层则是借助asm来兑现的,cglib这种第1方类库达成的动态代理应用更宽广,且在效能上更有优势。

复制代码 代码如下:

为了表明常量类的特定使用模块,大家平常会把模块名称加载类名里,导致常量类的名字相当长。在写代码的时候,日常往返copy,用户起来很不便于。 

cglib代理

重在行使的框架:

package testAOP;
public interface Saying {
public void sayHello(String name);   
public void talking(String name);
}

其实在jdk一.伍起始就曾经引进了“静态导入机制”,可以缓和那一个难题。 

import java.lang.reflect.Method; 
import org.springframework.cglib.proxy.Enhancer; 
import org.springframework.cglib.proxy.MethodInterceptor; 
import org.springframework.cglib.proxy.MethodProxy; 

public class ProxyCglibFactory implements MethodInterceptor {  

  private Object tarjectObject;  

  public Object creatProxyInstance(Object obj) {  
    this.tarjectObject = obj; 
    Enhancer enhancer=new Enhancer(); 
    enhancer.setSuperclass(this.tarjectObject.getClass()); 
    enhancer.setCallback(this); 
    return enhancer.create(); 
  } 

  @Override 
  public Object intercept(Object obj, Method method, Object[] args, 
      MethodProxy arg3) throws Throwable { 
    Object result = null;  
    if (AssessUtils.isAssess()) {  
      result = method.invoke(this.tarjectObject, args);  
    }else{ 
      throw new NoAssessException("This server cannot run this service."); 
    } 
    return result;  
  } 
} 

Spring中的AOP,Struts第22中学的拦截器

二个轻巧易行的落到实处类SayingImpl,如下:

静态导入机制

Aspect注解

具体落到实处:

复制代码 代码如下:

澳门新萄京 ,咱俩得以使用静态导入(static import)的办法
导入常量类,就足以制止用类名来修饰常量名。如下: 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AssessInterceptor { 
  @Pointcut(value="execution (* com..*.*(..))") 
  private void anyMethod(){}; 

  @Before("anyMethod()") 
  public void doBefore(JoinPoint joinPoint) throws NoAssessException{ 
    if (!AssessUtils.isAssess()) {  
      throw new NoAssessException("This server cannot run this service."); 
    } 
  } 

  /** 
   * Around异常的时候调用 
   * @param pjp 
   * @throws Throwable 
   */ 
  @Around("anyMethod()") 
  public void invoke(ProceedingJoinPoint pjp) throws Throwable{ 
    pjp.proceed();  
  } 

} 

壹、定义接口和贯彻类

package testAOP;
public class SayingImpl implements Saying {
    @Override
    public void sayHello(String name) {
        // TODO Auto-generated method stub
        System.out.println(name + “:大家好哎!”);
    }
    @Override
    public void talking(String name) {
        // TODO Auto-generated method stub
        System.out.println(name +
“:作者的乐趣是,大家要大力建设和煦社会!”);
    }
}

Java代码 

以上正是java代理体制的实例,如有疑问请留言恐怕到本站社区交换座谈,谢谢阅读,希望能支援到大家,谢谢大家对本站的支撑!

package com.example.service;
public interface UserService {
  public String getName(int id);
  public Integer getAge(int id);
}


package com.example.service.impl;
import com.example.service.UserService;
public class UserServiceImpl implements UserService {
  public String getName(int id) {
    System.out.println("------getName------");
    return "cat";
  }
  public Integer getAge(int id) {
    System.out.println("------getAge------");
    return 10;
  }
}

大家要落到实处的是,在sayHello和talking在此以前和事后分别动态植入管理。

import static com.sky.OrderMouleConsstants.*; //这个地方一定要用.* 否则编译不过 
/** 
 * Created by gantianxing on 2017/4/21. 
 */ 
public class Test { 
  public void main() { 
    int orderState = orderService.getOrderState(id); 
    if(SUCCESS == orderState){ //不用再加静态类名了 
      //订单成功状态逻辑 
    } 
    if(FAIL == orderState){ //不用再加静态类名了 
      //订单失败状态逻辑 
    } 
  } 
} 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图