黑马程序员_高薪技术(3),黑马高薪
分享于 点击 35871 次 点评:53
黑马程序员_高薪技术(3),黑马高薪
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
<span >package cn.itcast.day3;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
public class ProxyTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
System.out.println(clazzProxy1.getName());
System.out.println("----------begin constructors list----------");
/*$Proxy0()
$Proxy0(InvocationHandler,int)*/
Constructor[] constructors = clazzProxy1.getConstructors();
for(Constructor constructor : constructors){
String name = constructor.getName();
StringBuilder sBuilder = new StringBuilder(name);
sBuilder.append('(');
Class[] clazzParams = constructor.getParameterTypes();
for(Class clazzParam : clazzParams){
sBuilder.append(clazzParam.getName()).append(',');
}
if(clazzParams!=null && clazzParams.length != 0)
sBuilder.deleteCharAt(sBuilder.length()-1);
sBuilder.append(')');
System.out.println(sBuilder.toString());
}
System.out.println("----------begin methods list----------");
/*$Proxy0()
$Proxy0(InvocationHandler,int)*/
Method[] methods = clazzProxy1.getMethods();
for(Method method : methods){
String name = method.getName();
StringBuilder sBuilder = new StringBuilder(name);
sBuilder.append('(');
Class[] clazzParams = method.getParameterTypes();
for(Class clazzParam : clazzParams){
sBuilder.append(clazzParam.getName()).append(',');
}
if(clazzParams!=null && clazzParams.length != 0)
sBuilder.deleteCharAt(sBuilder.length()-1);
sBuilder.append(')');
System.out.println(sBuilder.toString());
}
System.out.println("----------begin create instance object----------");
//Object obj = clazzProxy1.newInstance();//没有不带参数的构造方法
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);//从这一段开始就必须要的到有参的
//构造方法。
//此时的构造方法只接受一个参数。InvocationHandler
//这个时候的InvocationHandler必须要导入包。否则报错,同时还要抛出异常。
//这个InvocationHandler是一个接口,这个时候接口是没有办法新建一个对象的,必须要新建一个它的实现类的对象。
class MyInvocationHander1 implements InvocationHandler{
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
} //因为InvacationHandler是一个接口是不允许创建对象的,必须要在它的实现类中创建一个实现类,
//所以以上都是程序员自己做的实现类。
Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHander1());//这个时候new出来的就
//是一个对象,但是这个对象必须是Collection类型。名字为:Proxy1;
System.out.println(proxy1);//词条语句就是打印新建的Collection类型的对象:Proxy1;
//这个时候打印的是null值;有两种可能第一:Proxy1没有创建成功,另外一种可能就是:它的toString方法返回值就是null
proxy1.clear();//这条语句在编译运行的时候并没有,报出空指针异常的,这说明对象已经创建成功。
//proxy1.size();//但是如果这个时候调用size()方法,控制台会报错,这个size()方法,是有返回值的,因此不能够成功调用
//System.out.println("111111111111111");
Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){//这个时候传进去一个对象。
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}//这个时候增加了没有实现的方法。
});//这个时候new了一个匿名内部类!
final ArrayList target = new ArrayList();
Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
proxy3.add("zxx");
proxy3.add("lhm");
proxy3.add("bxd");
System.out.println(proxy3.size());
System.out.println(proxy3.getClass().getName());
}
private static Object getProxy(final Object target,final Advice advice) {
Object proxy3 = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
/*new Class[]{Collection.class},*///这三个参数写了三行。
target.getClass().getInterfaces(),
new InvocationHandler(){
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(method.getName() + " running time of " + (endTime - beginTime));
return retVal;*/
advice.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
return retVal;
}
}
);
return proxy3;
}
}
</span>
高薪技术:
50_张孝祥Java高新技术_创建动态类及查看其方法列表信息
51_张孝祥Java高新技术_创建动态类的实例对象及调用其方法
这行代码的为了以上的两个视频做了代码的解释!
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
相关文章
- 暂无相关文章
用户点评