package com.j2se.g_reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class AppTest {
public static void main(String[] args) throws Exception {
// 得到Person的Class对象实例(的三种方式)
Class<Person> clazz = Person.class;
Class clazz2 = new Person().getClass();
Class clazz3 = Class.forName("com.j2se.g_reflect.Person");
// 获取类中的信息(字段、方法、构造器)
Field[] fields = clazz.getFields(); // 获取所有公共的字段信息,包括继承过来的字段
Method[] methods = clazz.getMethods(); // 获取所有公共的方法信息,包括继承过来的方法
Constructor[] constructors = clazz.getConstructors();
// 显示类的信息
System.out.println("类的全限定名称:" + clazz.getName());
System.out.println("类的简单名称:" + clazz.getSimpleName());
System.out.println("类的修饰符:" + clazz.getModifiers());
System.out.println("类的父类类型:" + clazz.getSuperclass());
System.out.println("类的实现的接口:" + Arrays.toString(clazz.getInterfaces()));
System.out.println("=================");
// 显示信息
for (Field field : fields) {
System.out.println("字段的修饰符:" + field.getModifiers());
System.out.println("字段类型:" + field.getType());
System.out.println("字段名:" + field.getName());
// System.out.println("字段值:" +field.get(instance));
System.out.println();
}
System.out.println("=========");
for (Method method : methods) {
System.out.println("方法的修饰符:" + method.getModifiers());
System.out.println("方法的返回值类型:" + method.getReturnType());
System.out.println("方法的参数类型:" + Arrays.toString(method.getParameterTypes()));
System.out.println("方法的名称:" + method.getName());
System.out.println();
}
System.out.println("=========");
for (Constructor c : constructors) {
System.out.println("构造器的修饰符:" + c.getModifiers());
System.out.println("构造器的名称:" + c.getName());
System.out.println("构造器的参数的类型:" + Arrays.toString(c.getParameterTypes()));
System.out.println();
}
}
}
运行结果:
类的全限定名称:com.j2se.g_reflect.Person
类的简单名称:Person
类的修饰符:1
类的父类类型:class java.lang.Object
类的实现的接口:[interface java.io.Serializable]
=================
字段的修饰符:1
字段类型:class java.lang.String
字段名:name
字段的修饰符:1
字段类型:class java.lang.Character
字段名:gender
=========
方法的修饰符:1
方法的返回值类型:int
方法的参数类型:[]
方法的名称:getAge
方法的修饰符:1
方法的返回值类型:void
方法的参数类型:[int]
方法的名称:setAge
方法的修饰符:17
方法的返回值类型:void
方法的参数类型:[]
方法的名称:wait
方法的修饰符:17
方法的返回值类型:void
方法的参数类型:[long, int]
方法的名称:wait
方法的修饰符:273
方法的返回值类型:void
方法的参数类型:[long]
方法的名称:wait
package com.j2se.g_reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AppTest2 {
public static void main(String[] args) throws Exception {
// 得到Person的Class对象实例(的三种方式)
Class<Person> clazz = Person.class;
// Class clazz2 = new Person().getClass();
// Class clazz3 = Class.forName("<span style="font-family: Arial, Helvetica, sans-serif;">com.j2se.g_reflect</span>.Person");
// 创建对象的实例(使用无参的构造器时一般用这个方法)
Object instance = clazz.newInstance(); // 使用默认的构造方法创建对象的实例
System.out.println(instance);
// 创建对象的实例2(使用有参的构造器时只能使用这个方法)
Constructor c = clazz.getConstructor(String.class, int.class); // 获取有指定参数列表的构造器
Object instance2 = c.newInstance("张三", 20);
System.out.println(instance2);
// 对于字段的操作
Field field = clazz.getField("name");
Object value = field.get(instance2); // 获取字段的值
System.out.println(field.getName() + " = " + value);
// 改变字段的值
field.set(instance2, "李四");
value = field.get(instance2); // 获取字段的值
System.out.println(field.getName() + " = " + value);
// 对于方法的操作(调用)
Method method = clazz.getMethod("getAge");
Integer age = (Integer)method.invoke(instance2);
System.out.println("getAge() = " + age);
}
}
执行结果:
com.j2se.g_reflect.Person@150bd4d
com.j2se.g_reflect.Person@1888759
name = 张三
name = 李四
getAge() = 20
第三个Demo:
package com.j2se.g_reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
public class AppTest3 {
public static void main(String[] args) throws Exception {
// 得到Person的Class对象实例(的三种方式)
Class<Person> clazz = Person.class;
Class clazz2 = new Person().getClass();
Class clazz3 = Class.forName("com.j2se.g_reflect.Person");
Object instance = new Person("王五", 21);
// 获取类中的信息(字段、方法、构造器)
// Field[] fields = clazz.getFields(); // 获取所有公共的字段信息,包括继承过来的字段
// Method[] methods = clazz.getMethods(); // 获取所有公共的方法信息,包括继承过来的方法
// Constructor[] constructors = clazz.getConstructors();
Field[] fields = clazz.getDeclaredFields(); // 获取所有在本类中声明的字段信息,包括所有修饰符的字段(当然也包括私有的)
Method[] methods = clazz.getDeclaredMethods();
Constructor[] constructors = clazz.getDeclaredConstructors();
// 显示信息
for (Field field : fields) {
field.setAccessible(true); // 强制访问(暴力反射)
System.out.println("字段的修饰符:" + field.getModifiers());
System.out.println("字段类型:" + field.getType());
System.out.println("字段名:" + field.getName());
System.out.println("字段值:" + field.get(instance));
System.out.println();
}
System.out.println("=========");
for (Method method : methods) {
// method.setAccessible(true);
System.out.println("方法的修饰符:" + method.getModifiers());
System.out.println("方法的返回值类型:" + method.getReturnType());
System.out.println("方法的参数类型:" + Arrays.toString(method.getParameterTypes()));
System.out.println("方法的名称:" + method.getName());
System.out.println();
}
System.out.println("=========");
for (Constructor c : constructors) {
System.out.println("构造器的修饰符:" + c.getModifiers());
System.out.println("构造器的名称:" + c.getName());
System.out.println("构造器的参数的类型:" + Arrays.toString(c.getParameterTypes()));
System.out.println();
}
}
}
执行结果:
字段的修饰符:1
字段类型:class java.lang.String
字段名:name
字段值:王五
字段的修饰符:2
字段类型:int
字段名:age
字段值:21
字段的修饰符:1
字段类型:class java.lang.Character
字段名:gender
字段值:null
=========
方法的修饰符:2
方法的返回值类型:class java.lang.String
方法的参数类型:[]
方法的名称:getName
方法的修饰符:2
方法的返回值类型:void
方法的参数类型:[class java.lang.String]
方法的名称:setName
方法的修饰符:1
方法的返回值类型:int
方法的参数类型:[]
方法的名称:getAge
方法的修饰符:1
方法的返回值类型:void
方法的参数类型:[int]
方法的名称:setAge
=========
构造器的修饰符:1
构造器的名称:com.j2se.g_reflect.Person
构造器的参数的类型:[]
构造器的修饰符:2
构造器的名称:com.j2se.g_reflect.Person
构造器的参数的类型:[class java.lang.String]
构造器的修饰符:1
构造器的名称:com.j2se.g_reflect.Person
构造器的参数的类型:[class java.lang.String, int]
package com.j2se.g_reflect;
import java.lang.reflect.Modifier;
public class AppTest4 {
public static void main(String[] args) throws Exception {
// 得到Person的Class对象实例(的三种方式)
Class<Person> clazz = Person.class;
// 获取类的修饰符
int modifier = clazz.getModifiers();
System.out.println("是static吗?" + Modifier.isStatic(modifier));
System.out.println("是private吗?" + Modifier.isPrivate(modifier));
System.out.println("是public吗?" + Modifier.isPublic(modifier));
}
}