Java 에이전트의 작은 예
6014 단어 java 에이전트
호출 프로세서 (invocation handler) 가 필요하고, 호출 프로세서는 Invocation Handler 인터페이스를 실현해야 합니다.프록시 대상을 호출하는 방법은 언제든지 호출 프로세서의 invoke 방법을 호출하고 Method 대상과 원시 호출 파라미터를 전달합니다.
프록시 객체를 만들려면 Proxy 클래스의 newProxyInstance 메서드를 사용해야 합니다.이 방법에는 세 가지 매개변수가 있습니다.
1,클래스 로더(class loader),null은 기본값
2. 인터페이스 배열
3, 1 호출 프로세서
프록시 역할 사용:
1. 원격 서버에 대한 루트 호출
2. 프로그램이 실행되는 동안 사용자 인터페이스 이벤트와 동작을 연결시킨다(spring AOP은 바로)
3, 디버깅, 추적 방법 호출
다음 예는 추적 방법이 호출된 것이다.이분 검색법의 경우 참고: Integer는 comparable 인터페이스를 실현하고 프록시 클래스는 toString 방법을 덮어씁니다.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Date;
import java.util.Random;
import javax.swing.JOptionPane;
import javax.swing.Timer;
public class TextMain {
public static void main(String args[]) {
Object[] elements=new Object[1000];
for(int i=0;i<elements.length;i++){
Integer value=i+1;
InvocationHandler handler=new TraceHandler(value);
Object proxy=Proxy.newProxyInstance(null, new Class[]{Comparable.class}, handler);
elements[i]=proxy;
}
Integer key=new Random().nextInt(elements.length)+1;
int result=Arrays.binarySearch(elements, key);
if(result>=0)System.out.println(elements[result]);
}
}
class TraceHandler implements InvocationHandler{
private Object target;
public TraceHandler(Object t){
target=t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.print(target);
System.out.print("."+method.getName()+"(");
if(args!=null){
for(int i=0;i<args.length;i++){
System.out.print(args[i]);
if(i<args.length-1)
System.out.print(",");
}
}
System.out.println(")");
return method.invoke(target, args);
}
}
실행 결과:
500.compareTo(269)
250.compareTo(269)
375.compareTo(269)
312.compareTo(269)
281.compareTo(269)
265.compareTo(269)
273.compareTo(269)
269.compareTo(269)
269.toString()
269
InvocationHandler의 invoke 방법은 프록시 대상이 호출할 때 실행하고자 하는 동작 (추적, 로그 기록) 을 정의합니다.
Proxy에서 newProxyInstance는 지정한 인터페이스를 실현하는 프록시 클래스를 구성합니다. 모든 방법은 프로세서 대상에 대한 invoke 방법을 호출합니다.
모든 프록시 클래스는 proxy 클래스로 확장되며, Proxy는 하나의 실례역만 있습니다. 호출 프로세서 InvocationHandler