反射:通过类名获取该类的所有成员方法、变量,或者实例化对象等。
例:Class B 访问Class A 的retnum方法
package com.ysu.fams.webservices;
public class A {
int count = 40;
public int retnum(int i){
count = i;
return count;
}
}
package com.ysu.fams.webservices;
import java.lang.reflect.Method;
public class B{
public static void main(String[] args) throws Exception{
//获取A类对应的一个class对象
Class cl = Class.forName("com.ysu.fams.webservices.A");
//获取A类对应的一个实例化对象
Object object = cl.newInstance();
//获取A类对应的retnum方法对应的一个对象实例
Method method = cl.getMethod("retnum", int.class);
//调用A类方法获取结果
Object result = method.invoke(object, 2);
System.out.println(result); //输出结果:2
}
}
代理:为其他对象提供一种代理以控制对这个对象的访问,通过代理类访问真实的对象。
public interface Hello{
public String getHello(String str);
public String test();
}
public class A implements Hello{
public String getHello(String str) {
// TODO Auto-generated method stub
return str;
}
public String test(){
return "test";
}
}
public class B implements InvocationHandler{
private Object obj;
public B(Object obj){
this.obj = obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("拦截方法:"+method.getName());
return method.invoke(obj, args);
}
public static void main(String[] args) throws Exception{
//真实对象(即被代理对象)
Hello hello = new A();
//为真实对象制定一个调用处理器
InvocationHandler h = new B(hello);
//获得真实对象(hello)的一个代理类
Object objHello = Proxy.newProxyInstance(hello.getClass().getClassLoader(),//真实对象的类加载器
hello.getClass().getInterfaces(),//真实对象实现的所有接口
h //真实对象的处理器
);
if(objHello instanceof Hello){
Hello he = (Hello)objHello;
String result = he.getHello("你好!");
System.out.println(result);
}else{
System.out.println("objHello isn't a Hello");
}
}
}