1.java反射获取Class类的4种方式
1.调用运行时类本身的.class属性
Class clazz = String.class;
2,通过运行时类的对象获取
Person p = new Person();
Class clazz = p.getClass();
3.通过Class的静态方法获取:体现反射的动态性
String className = “java.util.commons”; //全类名
Class clazz = Class.forName(className);
4.通过类的加载器
String className = “java.util.commons”; //全类名
ClassLoader classLoader = this.getClass().getClassLoader();
Class claz = classLoader.loadClass(className);
2.java利用反射访问类的私有(private)属性及方法 (步骤)
1.准备一个java类,包含私有属性及方法:
public class User {
private String field1="私有属性";
public String field2="公有属性";
public void fun1(){
System.out.println("fun1:这是一个public访问权限方法");
}
private void fun2(){
System.out.println("fun2:这是一个private访问权限方法");
}
private void fun3(String arg){
System.out.println("fun3:这是一个private访问权限且带参数的方法,参数为:"+arg);
}
}
2.编写测试代码 (一)
@Test
public void test02() throws IllegalAccessException, InvocationTargetException {
User user = new User();
//1.获取所有属性
Field[] fields = user.getClass().getFields();
for (Field field:fields) {
//遍历获取属性和属性值
System.out.println(field.getName() +"-"+field.get(user));
}
//2.获取所有方法
Method[] methods = user.getClass().getMethods();
for (Method method:methods){
System.out.println(method.getName() +"-"+ method.invoke(user));
}
}
结果显示:
field2-公有属性
fun1:这是一个public访问权限方法
这里均为调用到类到私有属性和私有方法。。。。改造测试代码如下
@Test
public void test02() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
User user = new User();
//1.获取所有属性
Class<?> clazz = Class.forName("com.dtdream.dtp.User");
User bean = (User) clazz.newInstance();
Field[] fs = clazz.getDeclaredFields();
for (Field field : fs) {
// 要设置属性可达,不然会抛出IllegalAccessException异常
field.setAccessible(true);
// 打印初始值
System.out.println("设置属性之前:" + field.getName() + "===" + field.get(bean));
}
}
显示结果:
设置属性之前:field1===私有属性
设置属性之前:field2===公有属性