转载请注明出处:http://blog.csdn.net/droyon/article/details/8607756
ReflectTest.java
package test;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
*
* @author Administrator
*反射主要有Class类、Field类,Constructor类,Method类、Array类
*/
public class ReflectTest {
public static void main(String args[]){
Class clazz = null;
//获取class对象
//Class clazz = TestJavaBean.class;
//Class clazz = new TestJavaBean().getClass();
try {
clazz = Class.forName("test.TestJavaBean");
//获取class包名
String packageName = clazz.getPackage().getName();
Log.d("包名:", packageName);
Log.d("类:",clazz.toString());
//获取类修饰符
int modify = clazz.getModifiers();
String mod = Modifier.toString(modify);
Log.d("类修饰符:",mod);
//获取类的全限定符
String className = clazz.getName();
Log.d("类全称:",className);
//获取父类
String superClazz = clazz.getSuperclass().getName();
Log.d("父类名称:",superClazz);
//获取实现的接口
Class[] interfaces = clazz.getInterfaces();
for(Class c :interfaces){
Log.d("实现的接口:",c.getName());
}
//成员变量
Field[] field = clazz.getDeclaredFields();
Log.d("分割线", "-------------------------");
for(Field f :field){
Log.d("成员变量:",f.getName()+"---"+f.getType().getName()+"---"+Modifier.toString(f.getModifiers()));
}
Log.d("分割线", "-------------------------");
//获取类的构造
Constructor[] constructors = clazz.getConstructors();
for(Constructor c :constructors){
Log.d("构造:",c.getName());
Class[] parasList = c.getParameterTypes();
for(Class paras :parasList){
Log.d("参数列表:",paras.getName());
}
}
//获取所有的方法
Method[] m = clazz.getDeclaredMethods();
for(Method method :m){
Log.d("成员方法:",method.getName()+"---修饰符"+Modifier.toString(method.getModifiers())+"---返回类型"+method.getReturnType());
Class[] parasType = method.getParameterTypes();
for(Class paras:parasType){
Log.d("方法参数:",paras.getName());
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//数组
int[] arr = new int[5];
Log.d("数组:",arr.getClass().getName()+"---"+arr.getClass().getCanonicalName()+"全名称:"+arr.getClass().getComponentType().getName());
//创建数组对象
Object obj = Array.newInstance(String.class, 3);
for(int i=0;i<3;i++){
Array.set(obj, i, "第"+(i+1)+"个元素");
}
for(int i=0;i<3;i++){
Log.d("创建的数组对象数据:",Array.get(obj, i)+"");
}
//创建对象
// TestJavaBean test = (TestJavaBean) createClassFactory.createClassObject("test.TestJavaBean");
try {
TestJavaBean test = (TestJavaBean) clazz.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Constructor c = clazz.getConstructor();//得到有参和无参构造方法
try {
TestJavaBean test = (TestJavaBean) c.newInstance();
test.setName("helloword");
Log.d("使用构造实例化对象:",test.getName());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//执行反射构造方法,如果类是标准的javaBean,那么可以使用PropertyDescriptor来获取方法名
//也可以直接使用方法名来获取方法,如果要获取私有(private)的方法,那么需要先调用Method.setAccessible(true)
//执行方法调用Method.invoke类执行方法。
//成员属性的得到 get和set
try {
Method method = clazz.getDeclaredMethod("getName");
try {
TestJavaBean test = (TestJavaBean) clazz.newInstance();
test.setName("hellowork");
Object returnValue = method.invoke(test, null);
Log.d("反射执行方法:","返回值为:"+returnValue);
Field f_name;
try {
f_name = clazz.getDeclaredField("name");
String name = (String) f_name.get(test);
Log.d("反射执行的成员属性",name);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//PropertyDescriptor
try{
Object new_w_r_object = clazz.newInstance();
PropertyDescriptor pd = new PropertyDescriptor("name", clazz);
Method m = pd.getWriteMethod();
m.invoke(new_w_r_object, "new helloword");
Method m_read = pd.getReadMethod();
String read_name = (String) m_read.invoke(new_w_r_object, null);
Log.d("PropertyDescriptor read name :",read_name);
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static class Log{
static void d(String tag ,String message){
System.out.println(tag+"-"+message);
}
}
static class createClassFactory{
static Object createClassObject(String clazz){
Object obj = null;
try {
obj = Class.forName(clazz).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
}
TestJavaBean.java
package test;
/**
* JavaBean
* 有一个无参构造方法
* 有属性,并且有get和set方法
*/
public class TestJavaBean {
private int id;
public String name = null;
protected long index;
boolean isTestOk;
int[] array;
public int[] getArray() {
return array;
}
public void setArray(int[] array) {
this.array = array;
}
public TestJavaBean(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getIndex() {
return index;
}
public void setIndex(long index) {
this.index = index;
}
public boolean isTestOk() {
return isTestOk;
}
public void setTestOk(boolean isTestOk) {
this.isTestOk = isTestOk;
};
}