您的位置:首页 > 编程语言 > Java开发

浅析java反射机制

2016-03-31 20:23 417 查看
     关于反射概述
             Java反射式JAVA被是为动态(或准动态)语言的一个关键特性,这个机制允许程序在运行时通过Refleaction
APIS取得任何一个已知名称的            class 的内部信息。
            java反射机制允许程序在运行时加载,探知,使用编译期间完全未知的class(注意:java可以加载一个运行时才得知名称的class,并获得其完整
        结构)

     主要用途:

          在运行时判断任意一个对象所属的类
            在运行时构造任意一个类的对象
            在运行时调用任意一个对象的方法

     如何使用:

       使用java的反射机制,一般需要遵循三步:
             1.获的逆向操作类的class对象;
                2.通过第一步获得的class对象去取得操作类的方法或者属性名;
                3.操作第二步取得的方法或者属性;
               如何取得操作类的Class对象?,常用的三种方式
                    1.调用Class的静态方法forName
 例如 Class<?> cls = Class.forName("类所在包路径.类名");
                2.使用类的.class语法,如Class
cls=String.class
                3.调用对象的getClass方法,如String
str='"abc";Class<?> cls=str.getClass();
              获取类的类的属性:调用
                       getDeclaredField(String name)返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明的私有字段

//通过对象字节码获取私有的字段属性
Field[] fields = clazz.getDeclaredFields();
//暴力反射声明


field.setAccessible(true);
//获取属性名
name = field.getName();


                       获得类的Method(常用的一种:ps可以查看源码了解更多的方式)
                     getMethod(String name,Class<?>...parameterTypes)     返回一个
Method对象,它反映此 Class对象所表示的类或接口的指定公            
     共成员方法.
              反射方式执行method方法

//执行方法
value = method.invoke(obj, null).toString();

         完整例子分析:

                  测试的实体类

   

/**
* @Title: Article
* @Description: 文章实体类 用于测试
* @Company:
* @Author 木易爽【247677857yh@gmail.com】
* @Date: 2016/3/31
* @Time: 20:01
*/
public class Article {
private Integer id;//标号
private String title;//标题
private String content;//内容

public Article() {
}

public Article(Integer id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

}
 测试类

package example;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* @Title: GetContent
* @Description: 通过反射获取实体的内容 以String返回
* @Company:
* @Author 木易爽【247677857yh@gmail.com】
* @Date: 2016/3/31
* @Time: 20:02
*/
public class GetContent {
//不让外界new该帮助类
private GetContent() {
}

/**
* 传入obj实体 通过反射机制获取实体对象的内容
*
* @param obj
* @return
* @throws Exception
*/
public static String getEntityContent(Object obj) throws Exception {
String content = "";
//获取obj引用的对象的字节码
Class clazz = obj.getClass();
//通过对象字节码获取私有的字段属性
Field[] fields = clazz.getDeclaredFields();
String name;//属性名
String methodName;//方法名
String value;//获取方法的返回值
Method method;//获取方法
for (Field field : fields) {
//暴力反射
field.setAccessible(true);
//获取属性名
name = field.getName();
//拼接方法名
methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
//获取方法 例如getId()/getTitle()/getContent()
method = clazz.getMethod(methodName, null);
//执行方法
value = method.invoke(obj, null).toString();
//将值加入到string对象中
content += value + ",";
}
return content;
}

public static void main(String[] args) throws Exception {
Article article = new Article(1, "反射", "反射机制是动态语言的特性");
String articleContent = GetContent.getEntityContent(article);
System.out.println(articleContent);
}
}


输出结果:

"C:\Program Files\Java\jdk1.8.0_65\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\software\idea\IntelliJ IDEA 15.0.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_65\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_65\jre\lib\rt.jar;D:\project\java_project\luceneDemo\target\classes;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-core\5.3.1\lucene-core-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-analyzers-common\5.3.1\lucene-analyzers-common-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-queryparser\5.3.1\lucene-queryparser-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-queries\5.3.1\lucene-queries-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-sandbox\5.3.1\lucene-sandbox-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\junit\junit\4.11\junit-4.11.jar;C:\Users\ShuangYang\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-memory\5.3.1\lucene-memory-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-highlighter\5.3.1\lucene-highlighter-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\org\apache\lucene\lucene-join\5.3.1\lucene-join-5.3.1.jar;C:\Users\ShuangYang\.m2\repository\commons-beanutils\commons-beanutils\1.9.2\commons-beanutils-1.9.2.jar;C:\Users\ShuangYang\.m2\repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;C:\Users\ShuangYang\.m2\repository\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;C:\Users\ShuangYang\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\software\idea\IntelliJ IDEA 15.0.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain example.GetContent
1,反射,反射机制是动态语言的特性,

Process finished with exit code 0
        测试说明:

                  这里在反射获取类Class对象的时候采用的是obj.getClass的方式,读者有兴趣可以都其余两种方式进行测试.

            参考链接:

              http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html
              http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html

              http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 反射