实体类(ClassTest)
package reflect.entity;
public class ClassTest {
private String test = "测试用例";
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
实体类(Person)
package reflect.entity;
public final class Person extends ClassTest implements java.io.Serializable {
private Integer id;
private String name;
private String address;
private String message;
public Person() {
System.out.println("通过无参构造方法实例化Person类对象");
}
private Person(String name, String address, String message) {
System.out.println("通过有参构造方法实例化Person类对象");
this.name = name;
this.address = address;
this.message = message;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "{name:" + name + ", address:" + address
+ ", message:" + message + "}";
}
}
实体类(Person.hbm.xml)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="reflect.entity.Person" table="person" >
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20" not-null="true" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="500" not-null="true" />
</property>
<property name="message" type="java.lang.String">
<column name="MESSAGE" length="500" not-null="true" />
</property>
</class>
</hibernate-mapping>
开始进行测试
GetClassConstructorsInfo
package reflect.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import reflect.entity.Person;
public class GetClassConstructorsInfo {
public static void main(String[] args) {
GetClassConstructorsInfo consTest = new GetClassConstructorsInfo();
// 测试通过java.lang.Class的newInstance()方法创建Person类实例
consTest.test1();
// 测试通过获取Constructor创建Person类实例
// consTest.test2();
}
public void test1() {
try {
Object obj = Class.forName("reflect.entity.Person").newInstance();
System.out.println(obj);
} catch (ClassNotFoundException 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();
}
}
public void test2() {
// 测试反射调用构造方法
try {
Class cls = Class.forName("reflect.entity.Person");
// 获取Person类声明的所有构造方法
// 它们是公共、保护、默认(包)访问和私有构造方法
// 如果此 Class 对象表示一个接口、一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组
Constructor[] cons = cls.getDeclaredConstructors();
// 构造方法的一些信息
System.out.println("=========构造方法展示=========");
for (Constructor con : cons) {
// 获取构造方法的参数列表
Class[] params = con.getParameterTypes();
if (params.length == 0) {
System.out.println("该构造方法没有参数");
} else {
System.out.print("该构造方法的参数列表为:[");
for (int i = 0; i < params.length; i++) {
if (i != 0)
System.out.print(", ");
System.out.print(params[i].getName());
}
System.out.println("]");
}
System.out.println("----------------------------");
}
// 获取Person的无参构造
Constructor c1 = cls.getDeclaredConstructor();
// Person的无参构造为public,这里可以直接访问
Object obj = c1.newInstance();
System.out.println(obj);
// 获取Person的有参构造
Constructor c2 = cls.getDeclaredConstructor(String.class,
String.class, String.class);
// Person的三参构造为private,这里已超出其访问范围,不能直接访问
// 通过setAccessable方法,设定为可以访问
c2.setAccessible(true);
obj = c2.newInstance("一个新人", "beijing", "Hello,大家好!");
System.out.println(obj);
} catch (ClassNotFoundException 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();
} 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();
}
}
}
效果图:
GetClassFieldsInfo
package reflect.test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import reflect.entity.Person;
public class GetClassFieldsInfo {
public static void main(String[] args) {
GetClassFieldsInfo fieldTest = new GetClassFieldsInfo();
// 查看字段信息
fieldTest.showFields();
// 直接访问字段
fieldTest.accessField();
}
public void showFields() {
Field[] fields;
try {
// 获取Person中的所有字段,
// 包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段,
// 如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
fields = Class.forName("reflect.entity.Person").getDeclaredFields();
// 展示字段的一些信息
System.out.println("===========字段展示==========");
for (Field field : fields) {
System.out.println("字段名:" + field.getName());
System.out.println("类型:" + field.getType().getName());
System.out.println("----------------------------");
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void accessField() {
// 本例演示通过反射操作Person的字段
try {
// 通过反射加载一个Person实例
Class cls = Class.forName("reflect.entity.Person");
Object obj = cls.newInstance();
// 获取name字段
Field name = cls.getDeclaredField("name");
// name字段为private,这里已超出其访问范围,不能直接访问
// 通过setAccessable方法,设定为可以访问
name.setAccessible(true);
// 先取值看一下
System.out.println("赋值前的name:" + name.get(obj));
// 为name字段赋值
name.set(obj, "New Person");
// 展示一下赋值效果
System.out.println("赋值后的name:" + name.get(obj));
} 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();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果图:
GetClassInfo
package reflect.test;
public class GetClassInfo {
public static void main(String[] args) {
try {
new GetClassInfo().test("reflect.entity.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void test(String clsName) throws ClassNotFoundException {
Class cls = Class.forName(clsName);
// 获取Person类所在的包
Package pkg = cls.getPackage();
System.out.println(cls.getSimpleName() + " 定义在:" + pkg.getName() + " 包中");
System.out.println("-------------------------");
// 获得此对象所表示的实体(类、接口、基本类型或 void)的超类的 Class
// 如果此对象表示 Object 类、一个接口、一个基本类型或 void,则返回 null
// 如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象
Class superClass = cls.getSuperclass();
System.out.println(cls.getName() + " 的超类是:" + superClass.getName());
System.out.println("-------------------------");
// 获得此对象所表示的类或接口实现的接口
// 如果此对象表示一个不实现任何接口的类或接口,则此方法返回一个长度为 0 的数组。
// 如果此对象表示一个基本类型或 void,则此方法返回一个长度为 0 的数组。
Class[] interfaces = cls.getInterfaces();
System.out.println(cls.getName() + " 所实现的接口:");
for (Class c : interfaces)
System.out.println("\t" + c.getName());
System.out.println("-------------------------");
}
}
效果图:
GetClassMethodsInfo
package reflect.test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import reflect.entity.Person;
public class GetClassMethodsInfo {
public static void main(String[] args) {
GetClassMethodsInfo med = new GetClassMethodsInfo();
// 展示方法调用
med.invokeSetter("reflect.entity.Person", "name", "java.lang.String", "张三");
// 展示Person类中的方法信息
// med.showMethod();
}
public void invokeSetter(String clsName, String propName, String propType,
Object propValue) {
try {
// 通过反射创建一个实例
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
String firstLetter = propName.substring(0, 1).toUpperCase();
String methodName = "set" + firstLetter + propName.substring(1);
// 根据方法名和参数列表获取setter方法
Method method = cls.getDeclaredMethod(methodName, Class.forName(propType));
// 如果需要,可以通过setAccessable方法,设定为可以访问
// method.setAccessible(true);
// 调用方法并传参
method.invoke(obj, propValue);
System.out.println(obj);
} 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();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void showMethod() {
Method[] methods;
try {
// 获取Person中的所有方法,
// 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法,
// 如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0
// 的数组。
methods = Class.forName("reflect.entity.Person")
.getDeclaredMethods();
// 展示方法的一些信息
System.out.println("===========方法展示==========");
for (Method method : methods) {
System.out.println("方法名:" + method.getName());
System.out.println("返回值类型:" + method.getReturnType().getName());
// 获取方法的参数列表
Class[] params = method.getParameterTypes();
if (params.length == 0) {
System.out.println("该方法没有参数");
} else {
System.out.print("该方法的参数列表为:[");
for (int i = 0; i < params.length; i++) {
if (i != 0)
System.out.print(", ");
System.out.print(params[i].getName());
}
System.out.println("]");
}
// 获取方法所属的类或接口的Class对象
Class declaringClass = method.getDeclaringClass();
System.out.println("方法声明在:" + declaringClass.getName() + " 中");
// 获取方法抛出的异常类型,即throws子句中声明的异常
Class[] exceptions = method.getExceptionTypes();
if (exceptions.length > 0) {
System.out.print("该方法抛出的异常有:[");
for (int i = 0; i < exceptions.length; i++) {
if (i != 0)
System.out.print(", ");
System.out.print(exceptions[i].getName());
}
System.out.println("]");
}
System.out.println("----------------------------");
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果图: