- 初始化:如果该类有父类,则对其初始化,执行静态初始化器和静态初始化块。
- 在运行时构造任意一个类的对象
- 在运行时调用任意一个对象的方法
- 在运行时判断任意一个对象所属的类
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
====================================================================
<1> 使用Class类的forName静态方法:
public static Class<?> forName(String className)
在JDBC开发中常用此方法加载数据库驱动: Class.forName(driver);
<2> 直接获取某一个对象的class:(编译时已知类型名称或已知对象)
Class<?> klass = int.class;
Class<?> classInt = Integer.TYPE;
<3> 调用某个对象的getClass()方法:
StringBuilder str = new StringBuilder(“123”);
Class<?> klass = str.getClass();
注意: 使用.class来创建Class对象的引用时,不会自动初始化该Class对象,使用forName(…)会自动初始化该Class对象。
一般:用instanceof关键字判断
反射:反射中Class对象的isInstance()方法
public native boolean isInstance(Object obj);
通过反射来生成对象主要有两种方式:
<1> 使用Class对象的newInstance()方法来创建Class对象对应类的实例。
Class<?> c = String.class;
Object str = c.newInstance();
<2> 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。
// 获取String所对应的Class对象
Class<?> c = String.class;
// 获取String类带一个String参数的构造器
Constructor constructor = c.getConstructor(String.class);
// 根据构造器创建实例
Object obj = constructor.newInstance(“23333”);
System.out.println(obj);
主要是通过Class类的getConstructor方法得到Constructor类的一个实例,而Constructor类有一个newInstance方法可以创建一个对象实例
<1> getDeclaredMethods() – 返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
public Method[] getDeclaredMethods() throws SecurityException
<2> getMethods() – 返回某个类的所有公共(public)方法,包括继承的公有方法
public Method[] getMethods() throws SecurityException
<3> getDeclaredMethod() – 返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数类型对应的Class对象
public Method getDeclaredMethod(String name, Class<?>… parameterTypes)
<4> getMethod() – 返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数类型对应的Class对象
public Method getMethod(String name, Class<?>… parameterTypes)
-
getDeclaredFields() – 访问所有已声明的成员变量,但不能访问继承的成员变量。
-
getFileds() – 访问所有已声明的公有(public)成员变量,包括继承的公有成员变量。
-
getDeclaredField() – 特定访问所有成员变量(不包括继承的),参数为成员变量的名字。
-
getFiled() – 特定访问公有成员变量(包括继承的),参数为成员变量的名字。
Class<?> cls = Class.forName(“java.lang.String”);
Object array = Array.newInstance(cls, 25);
//往数组里添加内容
Array.set(array, 0, “hello”);
Array.set(array, 1, “Java”);
Array.set(array, 2, “fuck”);
Array.set(array, 3, “Scala”);
Array.set(array, 4, “Clojure”);
//获取某一项的内容
System.out.println(Array.get(array,3));
其中的Array类为java.lang.reflect.Array类,我们通过Array.newInstance()创建数组对象,它的原型是:
public static Object newInstance(Class<?> componentType, int length) throws NegativeArraySizeException {
return newArray(componentType, length);
}
newArray()方法是一个Native方法:
private static native Object newArray(Class<?> componentType, int length) throws NegativeArraySizeException;
====================================================================
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。
最后
这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档
祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!
感谢大家的支持!!
pe, int length) throws NegativeArraySizeException;
====================================================================
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。
最后
这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档
祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!
感谢大家的支持!!
[外链图片转存中…(img-nnpjQuuI-1718874693345)]