面试题-15反射

1.使用new关键字

这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

2.使用Class类的newInstance方法

我们也可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。

3.使用Constructor类的newInstance方法

和Class类的newInstance方法很像,
java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。

4.使用clone方法

无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

5.使用反序列化

当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口

java反射得到一个类的私有方法

1.通过class.forname()获取类
2.获取目标对象 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method
method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法)
3.method.toGenericString()或method.toString()方法来输出方法的字符串形式
4.使用invoke()方法调用方法

在这里插入图片描述
在这里插入图片描述

类的加载过程
在这里插入图片描述
在这里插入图片描述

Class<?> c1 = Class.forName("com.zyf.dao.User");
Field[] fields = c1.getFields();//获取public 修饰的属性
for (int i = 0; i < fields.length; i++) {
    
    
    System.out.println(fields[i]);
}
System.out.println("11111111111111");
fields = c1.getDeclaredFields();//获取所有属性
for (int i = 0; i < fields.length; i++) {
    
    
    System.out.println(fields[i]);
}

Method[] methods = c1.getMethods();//获取所有本类+父类的publc公开的方法
for (int i = 0; i < methods.length; i++) {
    
    
    System.out.println(methods[i]);
}
System.out.println("=============");
methods = c1.getDeclaredMethods();//获取本类中的所有方法
for (int i = 0; i < methods.length; i++) {
    
    
    System.out.println(methods[i]);
}

在这里插入图片描述

//1.通过 Class.forName() 获取类
Class c1 = Class.forName("com.zyf.dao.User");
//2.通过newInstance()方法 获取具体的对象
Object user = c1.newInstance();
System.out.println(user);
//3.通过getDeclaredMethod 得到具体的方法
Method getName = c1.getDeclaredMethod("getName");
Method setName = c1.getDeclaredMethod("setName", String.class);
//4.通过invoke进行赋值和获取信息
setName.invoke(user,"zhangsan");
Object invoke = getName.invoke(user);
System.out.println(invoke);
System.out.println(user);
//5.通过getDeclaredConstructor(参数类型) 得到构造方法
Constructor<?> constructor = c1.getDeclaredConstructor(String.class, String.class);
//6.通过newInstance 得到对象 可以无参
Object s = constructor.newInstance("张飞", "11234");
//invoke(对象名,方法的参数值)
setName.invoke(s,"张云飞");
System.out.println(s);
//7.getDeclaredField获取属性
Field name = c1.getDeclaredField("name");//name属性是私有的 获取不到
//不能直接操作私有的属性,我们要关闭程序的安全监测,属性或者方法的setAccessible(true)
name.setAccessible(true);
name.set(s,"ppt");
System.out.println(s);
//8.getDeclaredMethod获取方法
Method setlalala = c1.getDeclaredMethod("setlalala", String.class);
//不能直接操作私有的属性,我们要关闭程序的安全监测,属性或者方法的setAccessible(true)
setlalala.setAccessible(true);
setlalala.invoke(s,"woshishui");
System.out.println(s);
 Field[] fields = c1.getFields();//获取public 修饰的属性
//        for (int i = 0; i < fields.length; i++) {
    
    
//            System.out.println(fields[i]);
//        }
//        System.out.println("11111111111111");
//        fields = c1.getDeclaredFields();//获取所有属性
//        for (int i = 0; i < fields.length; i++) {
    
    
//            System.out.println(fields[i]);
//        }
//
//        Method[] methods = c1.getMethods();//获取所有本类+父类的publc公开的方法
//        for (int i = 0; i < methods.length; i++) {
    
    
//            System.out.println(methods[i]);
//        }
//        System.out.println("=============");
//        methods = c1.getDeclaredMethods();//获取本类中的所有方法
//        for (int i = 0; i < methods.length; i++) {
    
    
//            System.out.println(methods[i]);
//        }

在这里插入图片描述

关闭监测能提高执行效率

猜你喜欢

转载自blog.csdn.net/zyf_fly66/article/details/114087047