反射机制
来源:互联网 发布:国资委党员网络培训 编辑:程序博客网 时间:2024/05/18 16:13
反射
作用:程序可以动态获取其本身定义的类、方法、字段等
应用领域:多数作为程序框架使用,常见为代码+配置文件结构等
相关类包
- java.lang.reflect.AccessibleObject
- java.lang.reflect.Constructor<T>
- java.lang.reflect.Field
- java.lang.reflect.Method
获取类方法
常用的获取类对象的三种方法(常用Class.forName()来获取到类对象)
核心方法
定义Person类
package org.nihaoi.fan; public class Person { //Person类的全地址名为 org.nihaoi.fan.Person //.... }
测试程序
@org.junit.Testpublic void test1() throws Exception{//1. 使用Class类的静态方法forName获取类对象 参数为:类的全地址名Class clazz = Class.forName("org.nihaoi.fan.Person");//2. 通过对象获取Person p = new Person();Class clazz0 = p.getClass();//3. 通过给定类名获取Class clazz1 = Person.class;System.out.println(clazz.getName());System.out.println(clazz0.getName());System.out.println(clazz1.getName());}
org.nihaoi.fan.Person org.nihaoi.fan.Person org.nihaoi.fan.Person
依据上述例子, 在配置文件中只需要给出对应类的全地址名,就可以通过发射机制获取到这个类。
这样设计会增强程序的适用性
获取类中的构造器
现在不仅要获取类对象,同时还要用获取到的Person类来实例化Person类的对象,此时如果Person中没有重写构造器,那只需要调用类对象的newInstance()方法即可。如果Person本身提供了多个构造器,那就需要先获取其构造器。
核心方法
对于public构造器 使用getConstructor即可
对于private构造器 使用getDeclaredConstructor获取
改写Person类
public class Person {public String secret ="handsome";public Person(){ System.out.println("person constructer null");}public Person(String name,int age){ System.out.println("person constructer name:"+name+",age:"+age);}private Person(String name,String des){ System.out.println("person private constructer :"+name+" is "+des);}}
@org.junit.Test public void test1() throws Exception{ //获取类对象 Class clazz = Class.forName("org.nihaoi.fan.Person"); //获取构造器(无参构造器) Constructor c0 = clazz.getConstructor(); Object o0 = c0.newInstance(); //使用构造器的newInstance方法实例化对象 //获取构造器(两个参数) Constructor c1 = clazz.getConstructor(String.class,int.class); Object o1 = c1.newInstance("fan",21); //获取pirvate构造器 Constructor c2 = clazz.getDeclaredConstructor(String.class,String.class); c2.setAccessible(true); //做权限强改 Object o2 = c2.newInstance("fan","man"); }
测试结果
person constructer nullperson constructer name:fan,age:21person private constructer :fan is man
获取到类的方法
对于public方法使用getMethod即可
对于private方法需要使用getDeclaredMethod方法,使用需要修改access属性
修改Person类
public class Person {public String secret ="handsome";public void eat(){System.out.println("person eat");}public String eat(String what){System.out.println("person eat:"+what);return "I what double:"+what+".";}private void drink(String what){System.out.println("person private method drink:"+what);}public static void drink(){System.out.println("person static method drink:");}}
测试程序
@org.junit.Testpublic void test1() throws Exception{//获取类对象Class clazz = Class.forName("org.nihaoi.fan.Person");//获取无参方法Method method0 = clazz.getMethod("eat", null);method0.invoke(clazz.newInstance(), null);//获取带参方法Method method1 = clazz.getMethod("eat", String.class);method1.invoke(clazz.newInstance(), "apple");//获取private带参方法Method method2 = clazz.getDeclaredMethod("drink", String.class);method2.setAccessible(true);method2.invoke(clazz.newInstance(), "water");//获取static带参方法Method method3 = clazz.getMethod("drink", null);method3.invoke(clazz, null);}
person eat person eat:apple person private method drink:water person static method drink:
获取字段
核心方法
Person类
public class Person {public String secret ="handsome";private String name ="fan";public static int age = 21;}
测试程序
@org.junit.Testpublic void test1() throws Exception{//获取类对象Class clazz = Class.forName("org.nihaoi.fan.Person");//获取public属性值Field field = clazz.getField("secret");System.out.println(field.get(clazz.newInstance()));System.out.println(field.getType());//获取private属性值Field field0 = clazz.getDeclaredField("name");field0.setAccessible(true);field.getType();System.out.println(field0.get(clazz.newInstance()));System.out.println(field0.getType());//获取static属性值Field field1 = clazz.getField("age");System.out.println(field1.get(null));System.out.println(field1.getType());}
测试结果
handsome class java.lang.String fan class java.lang.String 21 int
0 0
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- input标签file类型,选择多个文件进行上传
- C++中define与const的区别
- 十个利用矩阵乘法解决的经典题目
- 在线答题系统之题库建设
- camera.setParameters failed in android
- 反射机制
- cocos第一天 基础概念
- 原型模式--java描述
- BZOJ 1911: [Apio2010]特别行动队
- 浅谈 Adaboost 算法
- 译:Getting Started with Spark (in Python) Spark入门
- Android代码布局
- 莫队算法理解
- 时光抽控件