一、什么是反射机制?
反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;
获得Class类对象的三种方式:
方式一 :Class.forName([类名]);
Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。
1 |
Class cls = Class.forName( "com.oracle.vo.Person" ); |
方式二: 类名.class
要求运行的类库一定要有Person类
1 2 3 |
//编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型 //会为每个类定义一个属性,存储自己类的类对象 Class cls = Person. class ; |
方式三: 对象.getClass()
要求运行的类库中一定要有Person类 当持有了一个对象时,可以根据对象获得其类对象
1 2 3 |
Person p = new Person(); //getClass方法是Object类的方法,所有的对象都有getClass方法 Class cls = p.getClass(); |
二、Class类
API方法
1. getName() 获得类对象对应类的类名(全类名:包名+类名)
2. getSimpleName() 获得类对象对应类的类名
3. getPackage() 获得类对象对应类的包对象
1 2 3 4 5 6 7 8 9 10 |
try { Class cls = Class.forName( "com.oracle.vo.Person" ); System.out.println(cls.getName()); System.out.println(cls.getSimpleName()); Package page = cls.getPackage(); System.out.println(page.getName()); } catch (ClassNotFoundException e) {
e.printStackTrace(); } |
4. getField(String name) 根据名字获得 能访问的 属性。
5. getDeclaredField(String name) 根据名字获得属性。
6. getDeclaredFields() 获得所有的属性
7. getDeclaredMethod()
8. getDeclaredConstructor(Class... types) 根据参数列表获得构造器
9. newInstance() 通过无参构造器创建对象
10. getSuperClass() 获得父类的类对象
三、Package类
Package对象抽象为包
四、Field类
是属性的抽象,Field类的实例就是某个属性,Field类包括了属性名、属性类型、属性值、修饰范围等。
获得属性对象,主要的作用是对属性进行赋值或取值的操作。
1. get(Object obj) 返回Object :获得某个对象的属性值。
2. setAccessible(boolean flag) : 设置属性是否可访问。
3. set(Object obj,Object value) : 设置属性值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public static void main(String[] args) { //获得Person的类对象 ,获得Person的Class对象 Person p = new Person(); p.setName( "tom" ); try { Class cls = Class.forName( "com.oracle.vo.Person" ); //获得Person类中所有的属性 Field[] fields = cls.getFields(); //获得Person类中的name属性 Field field = cls.getDeclaredField( "name" ); System.out.println(field.getName()); //获得 某个Person对象 的name属性值 //field: Person类的name属性 //设置这个属性可访问,忽略修饰范围 field.setAccessible( true ); //设置p对象的name属性值 为jack field.set(p, "jack" ); System.out.println(field.get(p)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } |
五、Method类
invoke(Object obj, Object ... args) 返回Object : 执行method方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public static void main(String[] args) { //获得Person的类对象 ,获得Person的Class对象 Person p = new Person(); p.setName( "tom" ); try { Class cls = Class.forName( "com.oracle.vo.Person" ); //获得Person类的 method(String name) 方法对象 Method method1 = cls.getDeclaredMethod( "method" , String. class ); //获得Person类的 method() 方法对象 Method method2 = cls.getDeclaredMethod( "method" ); //method(int i,String name) 方法对象 Method method3 = cls.getDeclaredMethod( "method" , int . class ,String. class ); //获得全部方法 Method[] methods = cls.getDeclaredMethods(); //获得方法要作什么? 就是要调用方法 //obj参数: 调用哪个对象的方法 method1.invoke(p, "abc" ); System.out.println(method3.invoke(p, 10 , "abcd" )); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } |
六、Constructor类
newInstance(Object ... args) 调用构造器创建对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public static void main(String[] args) { //获得Person的类对象 ,获得Person的Class对象 Person p = new Person(); p.setName( "tom" ); try { Class cls = Class.forName( "com.oracle.vo.Person" ); //获得 public Person() 构造器 Constructor constructor1 = cls.getDeclaredConstructor(); //public Person(String name, int age) 构造器 Constructor constructor2 = cls.getDeclaredConstructor(String. class , int . class ); //获得构造器的作用,要调用构造器创建对象 Object obj1 = constructor1.newInstance(); Object obj2 = constructor2.newInstance( "tom" , 20 ); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } |
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
原文链接:https://blog.csdn.net/aigo_2021/article/details/123468720