第十四章 类型信息1(java的反射)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十四章 类型信息1(java的反射)相关的知识,希望对你有一定的参考价值。
1.java语言的反射
1 package cn.itcast_01; 2 /* 1.通过反射获取构造方法并使用 3 * // 获取字节码文件对象 4 Class c = Class.forName("cn.itcast_01.Person"); 5 //获取指定的构造器对象(仅仅是获取到了) 6 该方法的形式参数就是构造方法的形式参数的.class对象(Class<?>... parameterTypes) 7 * parameterTypes 参数是 Class 对象的一个数组 8 Constructor con = c.getDeclaredConstructor(String.class); 9 //使用构造器创建类的实例对象 10 //con.setAccessible(true);取消语言访问检查 11 Object obj = con.newInstance("风清扬"); 12 * 2.通过反射获取成员方法并使用 13 * // 获取字节码文件对象 14 Class c = Class.forName("cn.itcast_01.Person"); 15 Constructor con = c.getConstructor(); 16 Object obj = con.newInstance(); 17 // public Method getMethod(String name,Class<?>... parameterTypes) 18 // 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型 19 //获取成员方法对象 20 Method m1 = c.getMethod("show"); 21 Method m2 = c.getMethod("method", String.class); 22 //通过该对象调用成员方法 23 m1.invoke(obj); // 调用obj对象的m1方法 24 m2.invoke(obj, "hello");//调用obj对象的m2方法 25 * 3.通过反射获取成员变量并使用 26 * // 获取单个的成员变量 27 * Field addressField = c.getField("address"); 28 * //给指定变量赋值 29 * addressField.set(obj, "北京"); 30 * 31 * //取消语言访问检查 32 * addressField.setAccessible(true); 33 * con.setAccessible(true); 34 * m1.setAccessible(true); 35 */ 36 public class ReflectDemo { 37 38 }
2.获取构造函数对象并使用
1 package cn.itcast_01; 2 3 import java.lang.reflect.Constructor; 4 5 public class ReflectDemo2 { 6 public static void main(String[] args) throws Exception { 7 //Class类 public final class Class<T>extends Object 8 //获取类的字节码文件对象 9 /* 1.static Class<?> forName(String className) 10 * 2.public final Class<?> getClass() 11 * 3.例如,String.class 的类型是 Class<String>。 12 */ 13 //获取字节码文件对象 14 Class c = Class.forName("cn.itcast_01.Person"); 15 //获取构造方法对象 16 /* 1.Constructor<T> getConstructor(Class<?>... parameterTypes) 17 获取指定参数的公共构造器对象 18 * 2. Constructor<?>[] getConstructors() 19 获取所有公共构造器对象 20 3. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 21 获取指定参数的构造器对象 22 4.Constructor<?>[] getDeclaredConstructors() 23 获取所有构造器对象 24 */ 25 //获取构造器对象 26 //Constructor con = c.getConstructor();//无参构造 27 Constructor con = c.getDeclaredConstructor(String.class,int.class); 28 //使用构造器对象调用构造方法 29 Object obj = con.newInstance("张三",22); 30 Person p = (Person) con.newInstance("张三",22); 31 System.out.println(obj);//Person [name=张三, age=22] 32 System.out.println(p);//Person [name=张三, age=22] 33 } 34 }
3.获取普通成员方法
1 package cn.itcast_01; 2 import java.lang.reflect.Constructor; 3 import java.lang.reflect.Method; 4 public class ReflectDemo3 { 5 @SuppressWarnings("unchecked") 6 public static void main(String[] args) throws Exception { 7 //获取类的字节码文件对象 8 Class c = Class.forName("cn.itcast_01.Person"); 9 //获取构造器对象 10 Constructor con = c.getDeclaredConstructor(); 11 //创建新实例 12 Object obj = con.newInstance(); 13 /* 通过字节码文件对象获取成员方法对象: 14 * 1.Method getMethod(String name, Class<?>... parameterTypes) 15 * 2.Method[] getMethods() 16 * 3.Method getDeclaredMethod(String name, Class<?>... parameterTypes) 17 * 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 18 * 4.Method[] getDeclaredMethods() 19 * 返回Method对象的一个数组,包括私有和公有的方法,继承的除外 20 */ 21 //Method[] m = c.getDeclaredMethods(); 22 //获取成员方法对象(参数列表:方法名,方法形参的.class对象) 23 Method m1 = c.getDeclaredMethod("show"); 24 //使用成员方法对象 25 m1.invoke(obj);//show方法 26 //获取成员方法对象 27 Method m2 = c.getDeclaredMethod("method", String.class); 28 //使用该方法 29 m2.setAccessible(true); 30 m2.invoke(obj, "张三");//张三的method方法 31 System.out.println(m2.getName()); 32 } 33 }
4.获取字段属性
1 package cn.itcast_01; 2 import java.lang.reflect.Constructor; 3 import java.lang.reflect.Field; 4 5 public class ReflectDemo4 { 6 public static void main(String[] args) throws Exception { 7 //获取类的字节码文件对象 8 Class c = Class.forName("cn.itcast_01.Person"); 9 //获取构造器对象 10 Constructor con = c.getDeclaredConstructor();//无参构造器 11 //创建类的新实例(使用无参构造器) 12 Object obj = con.newInstance(); 13 //获取Field对象 14 /* 1.Field getDeclaredField(String name) 15 * 2.Field[] getDeclaredFields() 16 * 3.Field getField(String name) 17 * 4.Field[] getFields() 18 */ 19 Field nameField = c.getDeclaredField("name"); 20 Field ageField = c.getDeclaredField("age"); 21 //给Field对象赋值(必须制定对象) 22 nameField.setAccessible(true); 23 ageField.setAccessible(true); 24 nameField.set(obj, "张三"); 25 ageField.set(obj, 22); 26 System.out.println(obj);//Person [name=张三, age=22] 27 } 28 }
以上是关于第十四章 类型信息1(java的反射)的主要内容,如果未能解决你的问题,请参考以下文章