测试类
package com.sxf;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestPerson {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Person p1=new Person();
Class c1=p1.getClass();//第一种是系统自带的方法
System.out.println(c1);
Class c2=Person.class;//第二种也是系统自带的方法
System.out.println(c2);
Class c3=Class.forName("com.sxf.Person");//第三种也是系统自带的方法
System.out.println(c3);
System.out.println(c3.getMethods().toString());//获取方法值
System.out.println(c3.getDeclaredMethods());
System.out.println(c3.getConstructors());
Method [] methods = c2.getMethods();
for(Method method : methods){
System.out.println(method.getName());//work waid equls toString hashCode等
}
//获得类的所有方法。
Method [] allMethods = c2.getDeclaredMethods();
for(Method method : allMethods){
System.out.println(method.getName());//work say
}
Field [] allFields = c2.getDeclaredFields();
for(Field field : allFields){
System.out.println(field.getName());//name age
}
Field f1 = c2.getField("age");
System.out.println(f1);
//获得指定的私有属性
Field f2 = c2.getDeclaredField("name");
//启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
f2.setAccessible(true);
System.out.println(f2);
}
//灵活使用反射能让我们代码更加灵活,这里比如JDBC原生代码注册驱动,hibernate 的实体类,Spring 的 AOP等等都有反射的实现。但是凡事都有两面性,
//反射也会消耗系统的性能,增加复杂性等,合理使用才是真!
public void testGetParentField() throws Exception{
Class c1 = Class.forName("com.ys.model.Son");
//获取父类私有属性值
System.out.println(getFieldValue(c1.newInstance(),"privateField"));
}
public static Object getFieldValue(Object object,String fieldName) throws Exception{
Field field = getDeclaredField(object,fieldName);
return field.get(object);
}
public static Field getDeclaredField(Object obj,String fieldName) {
Field field = null;
Class c = obj.getClass();
for(; c != Object.class ; c = c.getSuperclass()){
try {
field = c.getDeclaredField(fieldName);
field.setAccessible(true);
return field;
}catch (Exception e){
//这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
//如果这里的异常打印或者往外抛,则就不会执行c = c.getSuperclass(),最后就不会进入到父类中了
}
}
return null;
}
}
//灵活使用反射能让我们代码更加灵活,这里比如JDBC原生代码注册驱动,
//hibernate 的实体类,Spring 的 AOP等等都有反射的实现。但是凡事都有两面性,反射也会消耗系统的性能,增加复杂性等,合理使用才是真!
bean类
package com.sxf;
public class Person {
private String name="shixinfa";
private int age=26;
public Person() {
}
private void say() {
System.out.println("private sya()");
}
public void work() {
System.out.println("public work()");
}
}
该博客主要介绍了Java反射机制的使用,通过三种方式获取类的Class对象,还展示了如何获取类的方法、属性等信息。同时提到反射在JDBC、Hibernate、Spring等中有应用,但也会消耗系统性能、增加复杂性,强调要合理使用。
8335

被折叠的 条评论
为什么被折叠?



