Java-反射详解-(面试问题收集)

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===公有属性

 

你可能感兴趣的:(java反射)