java反射

Posted strong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射相关的知识,希望对你有一定的参考价值。

 一,先看一下反射的概念:

             主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

             反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

 二,反射机制的作用:

              1,反编译:.class-->.java

              2,通过反射机制访问java对象的属性,方法,构造方法等;

 三,在这里先看一下sun为我们提供了那些反射机制中的类:

java.lang.Class;                

java.lang.reflect.Constructor; java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

四,具体功能实现:

//1. 反射机制获取类有三种方法,我们来获取Employee类型
 
//第一种方法:
    Class c1=Class.forName("Employee");
//第二种方法:每个类型都有class属性:
    Class c2=Employee.class;
//第三种方法: 任何一个对象都有getClass方法
    Employee=new Employee();
    Class c3=e.getClass();

    
 //2. 创建对象:利用newInstance;
 Class c=Class.forName("Employee");
 Object o=c.newInstance(); //调用了Employee的无参构造函数
 
 
 //3. 获取属性: 分为所有哦的属性和指定的属性
 //a. 获取所有的属性:
 Class c=Class.forName("java.lang.Integer");
 Field[] fs=c.getDeclaredFields();
 //可变长字符串,存储属性
 StringBuffer sb= new StringBuffer();
 //最外边的public定义 
 sb.append(Modifier.toString(c.getModifiers()) + " class"+ c.getSimpleName()+ "{\n");
 //里面的每一个属性
 for(Field field:fs){
     sb.append("\t"); //空格
     sb.append(Modifier.toString(field.getDeclaredFields())+" ");//获得属性的修饰符,例如public,static等等  
     sb.append(field.getType().getSimpleName()+"");//属性的类型的名字
     sb.append(field.getName()+";\n");//属性的名字+回车 
 }
 sb.append("}");
 System.out.println(sb);
 
 //获取特定的属性
 public static void main(String[] args) throws Exception{
     //获取类
     Class c=Class.forName("User");
     //获取id属性
     Field idF=c.getDeclaredFields("id");
     //实例化这个类赋给o
     Object o=c.newInstance();
     //打破封装
     //使用反射机制可以打破封装性,导致了java对象的属性不安全。
     idF.setAccessible(true);
     //给o对象的id属性赋值"110"  
     idF.set(o,"110");
     System.out.println(idF.get(o));
 }

 

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

 

 

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

 

 

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

 

以上是关于java反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景