1、获取类对象的几种方式
Class.forName(String name)
、类名.class
、实例对象.getClass()
private static void getClassDemo() throws Exception{
Class cls1 = Class.forName("java.lang.Object");
System.out.println(cls1); // class java.lang.Object
Class cls2 = Object.class;
System.out.println(cls2); // class java.lang.Object
Object obj = new Object();
Class cls3 = obj.getClass();
System.out.println(cls3); // class java.lang.Object
System.out.println(cls1 == cls2); // true
System.out.println(cls1 == cls3); // true
}
2、获取成员属性的四种方式
getFields()
、getField(String filedName)
、getDeclaredFields()
、getDeclaredFiled(String name)
- 两组两种类型,前两个获取由
public
修饰的成员属性,获取所有及指定单个 - 后两个是获取当前所有成员属性或指定某个成员属性
// 获取成员属性的方法
private static void getFiledsDemo() {
Class<Person> cls = Person.class;
// 获取public修饰的成员属性
Field[] fields = cls.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("------------");
// 获取所有成员属性
Field[] declaredFields = cls.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
}
3、获取构造方法的四种方式
getConstructors()
、getConstructor(Class<?>... parameterType)
获取public修饰的构造方法getDeclaredConstructors()
、getDeclaredConstructor(class<?>... parameterTypes)
获取所有构造方法
// 获取构造方法
private static void getConstructorsDemo() {
Class<Person> cls = Person.class;
// 获取所有public修饰的构造方法
Constructor[] constructors = cls.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
System.out.println("----------------");
// 获取所有构造方法
Constructor[] declaredConstructors = cls.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
}
4、获取成员方法的四种方式
getMethods()
、getDeclaredMethod(String name, Class<?>... parameterTypes)
获取public修饰的成员方法;getDeclaredMethods()
、getDeclaredMethod(String name, Class<?>... parameterTypes)
获取当前类的所有成员方法;
// 获取实例方法
private static void getMethodsDemo() throws Exception{
Class<Person> cls = Person.class;
// 获取public方法,包括父类的方法
Method[] methods = cls.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("------------");
// 获取当前类的所有方法
Method[] declaredMethods = cls.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
// 获取eat方法
Method eat = cls.getDeclaredMethod("eat");
System.out.println(eat); // void com.yusian.reflex.Person.eat()
}
5、构造方法与实例方法的调用
// 构造方法或实例方法的调用
private static void invokeDemo() throws Exception{
// 获取Person类对象
Class<Person> cls = Person.class;
// 获取Person对象的带参数构造函数
Constructor<Person> constructor = cls.getConstructor(String.class, int.class);
// 利用构造函数的newInstance方法生成实例对象
Person sian = constructor.newInstance("Sian", 21);
System.out.println(sian);
// 获取类对象方法,调用实例的方法
Method eat = cls.getDeclaredMethod("eat");
eat.invoke(sian);
Method method = cls.getDeclaredMethod("methodD");
// 如果是私有方法,则需要授权访问
method.setAccessible(true);
method.invoke(sian);
}
什么叫反射:将类的各个组成部分封装为其他对象,这就是反射!