用java反射的动机就是在运行时获取类的相关信息,希望在扩网络的远程平台上创建和运行对象的能力。 利用远端传来的.class字节文件,可以运行时生成相关的对象。
1.生成相关对象示例(比如说本地就传来了一个UserFeild.class文件)
Class clazz = Class.forName("cn.wzy.test.UserField");
UserField userField = (UserField) clazz.newInstance();
2.利用Class对象获取该类的字段或者方法、构造器信息
public
class
UserField {
private
int
id;
private
String name;
public
void
setId(
int
id) {
this
.id = id;
}
}
2.1 输出类的方法Class clazz = Class.forName("cn.wzy.test.UserField"); Method[] methods = clazz.getMethods(); for (Method m: methods) { System.out.println(m); }
输出信息如下:(第一个为该类自己的方法,其他的为基类Object的方法)
getMethods()返回的是所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
getDeclaredMethods()返回的是所有包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。
public void cn.wzy.test.UserField.setId(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
2.2 输出类的所有字段:getDeclaredFields()和getFields()的区别跟获取方法的两个形式一样,输出如下:Field[] fields = clazz.getDeclaredFields(); for (Field field: fields) { System.out.println(field); }
private int cn.wzy.test.UserField.id private java.lang.String cn.wzy.test.UserField.name