例子:通过一个代理类(Person.java)动态调用两个相似类(Man.java、Woman.java)。其中,代理类用java反射机制实现。参照:http://java.chinaitlab.com/advance/805648.html
Man.java
public class Man
{
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public void introduce(String name,Integer age){
System.out.println("name="+name+"& age="+age);
}
}
Woman.java
public class Woman
{
public Woman(){
}
public Woman(String name,int age){
this.name = name;
this.age = age;
}
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public void introduce(){
System.out.println("name:"+name+" &age:"+age);
}
}
代理类Person.java
import java.lang.reflect.*;
public class Person
{
public Person(){
}
private Object target; // 目标对象
private String methodName; // 目标方法
private Object[] params; // 参数数组
private Method method;
public Object getTarget()
{
return target;
}
public void setTarget(Object target)
{
this.target = target;
}
public String getMethodName()
{
return methodName;
}
public void setMethodName(String methodName)
{
this.methodName = methodName;
}
public Object[] getParams()
{
return params;
}
public void setParams(Object[] params)
{
this.params = params;
}
public Method getMethod()
{
return method;
}
public void setMethod(Method method)
{
this.method = method;
}
/*
* 重新设置目标方法
*/
public void reSetMethod(String methodName) throws ClassNotFoundException{
if(params!=null){
int paramsLength = params.length;
Class<?>[] paramsTypes = new Class<?>[paramsLength];
for(int i=0;i<paramsLength;i++){
paramsTypes[i] = params[i].getClass();
}//end for
try{
method = target.getClass().getMethod(methodName, paramsTypes);
}catch(Exception e){
e.printStackTrace();
}
}else{
try{
method = target.getClass().getMethod(methodName, null);
}catch(Exception e){
e.printStackTrace();
}
}
}//end method
/**
* 重新设置目标对象和方法
* @throws ClassNotFoundException
*/
public void reSetTarget(Object target,String methodName) throws ClassNotFoundException{
this.target = target;
this.reSetMethod(methodName);
}
/**
* 动态调用已绑定的方法
*/
public void doMethod() throws Exception{
reSetTarget(target,methodName);
this.method.invoke(target, params);
}
}
调用代理类
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ProxyTest
{
public void invoke(String className,Class<?>[] calsses,Object[] constructsParams,String methodName,Object[] params)throws Exception{
Class<?> clazz = Class.forName(className);
Constructor<?> cons = clazz.getConstructor(calsses);
Object obj = cons.newInstance(constructsParams);
Person person = new Person();
person.setTarget(obj);
person.setMethodName(methodName);//映射方法名
person.setParams(params);//映射方法参数
person.doMethod();//通过反射调用方法
}
/**
* @throws Exception
* @功能描述
* @输入参数
* @反馈值
*/
public static void main(String[] args) throws Exception
{
/**
* 运行时动态调用相似类
*/
ProxyTest test = new ProxyTest();
test.invoke("com.sinye.reflect.Man", null, null, "introduce", new Object[]{new String("梁山伯"),25});
test.invoke("com.sinye.reflect.Woman",new Class<?>[]{String.class,int.class}, new Object[]{"祝英台",new Integer(22)}, "introduce", null);
/**
* 运行时调用Man类的setName和getName方法
*/
Class cc = Class.forName("com.sinye.reflect.Man");
Object object = cc.newInstance();
Method m = cc.getDeclaredMethod("setName", new Class[]{String.class});
m.invoke(object, new Object[]{new String("shanbo")});
m = cc.getDeclaredMethod("getName", null);
String name = (String) m.invoke(object, null);
System.out.println(name);
}
}
分享到:
相关推荐
java反射机制例子
讲解了JAVA中反射机制,包含例子,代码!对初学者很有用
JAVA反射机制及应用例子.。。Reflection API
一个例子8个demo让你了解Java反射机制
这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。
java线程池和反射机制例子
该例子讲解了java反射机制的实现。动态动态设置属性值等等。
希望可以在你学习java反射机制时有所帮助
有大量的实验例子和反射的各种方法说明,有大量的实验例子和反射的各种方法说明。
通过简单的例子了解Java反射机制
通过例子对java反射机制做了一个深刻的介绍
java反射详解,详细说明java反射内部机制,适合初学者。
反射机制例子及反射方法调用,自己写的一个测试例子。 例子实现了通过字符串指定类名,并调用类的方法
要使用蓝牙设备进行通讯必须的先使两个设备之间建立连接,Android SDK中提供了一些方法可供调用,但是有些方法没有提供接口,于是参考了网上的一些资料写了这个例子,顺便学习下Android反射机制的使用,自测OK,留待...
Java反射案例,可以参考: Java反射机制 - 相关API:https://blog.csdn.net/niuba123456/article/details/85951088
JAVA反射机制原理剖析配经典例子,以及模拟DBUTIL发射实现的JDBC操作包自己写的一个DEMO 如果模拟写的弄懂了 反射机制保准你懂了!
一个java反射的例子,通过java反射机制,动态生成java实例,动态执行方法。例子中有大量注释,简单易懂。
Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实例,下面的例子演示了...
简单易懂的例子,让你瞬间明白反射和代理的原理