准备条件:
1. 创建工程Reflection
示例1:
DumpMethods.java
示例2
InvokeTester.java
示例3
ReflectTester.java
1. 创建工程Reflection
示例1:
DumpMethods.java
package com.test;
import java.lang.reflect.Method;
public class DumpMethods {
//从命令行接受一个字符串(该字符串是某个类的全名)
//打印出该类中的所有方法声明
public static void main(String[] args) throws ClassNotFoundException {
//Class类是Java反射的入口点
Class<?> classType=Class.forName(args[0]);
Method[] methods=classType.getDeclaredMethods();
for(Method method : methods){
System.out.println(method);
}
}
}
示例2
InvokeTester.java
package com.test;
import java.lang.reflect.Method;
public class InvokeTester {
public int add(int param1,int param2){
return param1+param2;
}
public String echo(String msg){
return "hello:"+msg;
}
public static void main(String[] args) throws Exception {
//会获得InvokeTester类所对应的Class对象
Class<?> classType=InvokeTester.class;
Object invokeTester=classType.newInstance();
//以上两行代码等价于
//InvokeTester i=new InvokeTester();
Method addMethod=classType.getMethod("add", new Class[]{int.class,int.class});
Object result=addMethod.invoke(invokeTester, new Object[]{1,2});
//以上两行代码等价于
//i.add(1,2);
System.out.println((Integer)result);
Method echoMethod=classType.getMethod("echo", new Class[]{String.class});
Object result2=echoMethod.invoke(invokeTester, new Object[]{"world"});
//以上两行代码等价于
//i.echo("world");
System.out.println((String)result2);
}
}
示例3
ReflectTester.java
package com.test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTester {
public Object copy(Object obj) throws Exception {
Class<?> classType = obj.getClass();
System.out.println(classType.getName());
Object objectCopy = classType.getConstructor(new Class[] {})
.newInstance(new Object[] {});
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
String fieldName = field.getName();
//获得属性首字母并转换为大写
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
//获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1);
Method getMethod = classType.getMethod(getMethodName, new Class[] {});
Object value = getMethod.invoke(obj, new Object[] {});
Method setMethod = classType.getMethod(setMethodName, new Class[] { field
.getType() });
setMethod.invoke(objectCopy, new Object[] { value });
}
return objectCopy;
}
public static void main(String[] args) throws Exception {
Customer cust = new Customer();
cust.setId(new Long(1));
cust.setName("张三");
cust.setAge(22);
Customer copycust = (Customer) new ReflectTester().copy(cust);
System.out.println(copycust.getId() + ":" + copycust.getName() + ":"
+ copycust.getAge());
}
}
class Customer {
public Customer(){}
private Long id;
private String name;
private int age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
}