java基础之通过反射获得和使用类的字段、方法、构造器,等

来源:互联网 发布:淘宝网聚划算天天特价 编辑:程序博客网 时间:2024/05/17 23:37
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@150bd4dcom.j2se.g_reflect.Person@1888759name = 张三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));}}



0 0
原创粉丝点击