java-反射

反射

反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操作java代码的程序。
反射(reflective)是一个能够分析类能力的程序。
反射机制的作用是:

  • 运行时分析类的能力
  • 运行时查看对象
  • 实现通用数组操作代码。
  • 利用Method对象。

利用反射获取Class类型的实例方法有三种。

  • getClass()方式。
	public static void main(String[] args) {
        Employee e = new Employee();
        Class employee = e.getClass();
       
        System.out.println(employee.getName());
        
    }
  • 静态方法ForName();
	public static void main(String[] args) {
        String ClassName = "reflective.Employee";
        Class employee;
        try {
            employee = Class.forName(ClassName);
            System.out.println(employee.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
  • 如果T是任意的java类型,T.class将代表匹配对象。例如:
	 public static void main(String[] args) {

        Class employee = Employee.class;
        System.out.println(employee.getName());
    }

创建对象的实例可以用newInstance方法,newInstance方法调用默认的构造器,初始化新建对象。

在 java.lang.reflect中含有三个类Filed、Method、Constructor分别用来描述域、方法、构造器。三个类中有一个叫做getName的方法用来返回项目名称。
getmodifiers():什么都不加 是0 , public 是1 ,private 是 2 ,protected 是 4,static 是 8 ,final 是 16。
getParameterTypes():用来描述参数类型的方法。
getReturnType():用来描述返回值得类型。

public static void main(String[] args) {
        String ClassName = "reflective.Employee";
        Class employee;
        try {
            employee = Class.forName(ClassName);

            Field[] fields = employee.getDeclaredFields();
            for (Field f : fields){
                Class type = f.getType();
                String name = f.getName();
                System.out.println(name);
            }
            Method[] methods = employee.getDeclaredMethods();
            for (Method m : methods){
                System.out.println(m.getName());
                System.out.println(m.getReturnType());
                Class[] paramTypes = m.getParameterTypes();
                System.out.println(m.getModifiers());
                for(int j = 0;j< paramTypes.length;j++){
                    if(j>0) System.out.println(",");
                    System.out.println(paramTypes[j].getName());
                }
            }
            Constructor[] constructors = employee.getConstructors();
            for(Constructor c :constructors){
                String Modifiers = Modifier.toString(c.getModifiers());
                System.out.println(c.getName());
                Class[] paramTypes = c.getParameterTypes();
                for(int j= 0;j< paramTypes.length;j++){
                    System.out.println(paramTypes[j].getName());
                }
            }


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

反射的访问机制受限于java的访问控制。然而,如果一个Java程序没有受到安全管理机制,就可以覆盖访问控制。为了达到这个目的,需要调用Filed、Method、或Constructor对象的setAccessible方法。
setAccessible()。
调用任意方法可以用invoke()
返回一个给定具体类型维度的方法。newInstance(Class componentType,int length);
newInstance(Class componentType,int[] lengths);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值