【java】java反射初探 ——“当类也照起镜子”
反射的作用

类也是对象
“类”对象和“类”类型
Class a
取得Class对象的三种方式
public class MyClass { }
Class classInstance= MyClass.class;
二. 通过类创建的实例对象的getClass方法取得
MyClass myClass = new MyClass();
Class classInstance = myClass.getClass();
三.通过Class类的静态方法forName方法取得(参数是带包名的完整的类名)
Class classInstance = Class.forName("mypackage.MyClass");
try {
Class classInstance = Class.forName("mypackage.MyClass");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
利用反射API全面分析类的信息——方法,成员变量,构造器
public class MyClass {
private int value; //成员变量
public MyClass (int value) { this.value = value; } //构造函数
public int getValue() { return value; } //方法1
public void setValue(int value) { this.value = value; } //方法2
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void printClassMessage (Object obj) {
Class c = obj.getClass(); // 获取obj所属类的Class对象
Method [] methods = c.getDeclaredMethods(); // 获取方法对象列表
System.out.println("遍历MyClass类里的所有方法的名称:");
for(int i =; i<methods.length; i++) {
System.out.println(methods[i].getName());
}
Field [] fields = c.getDeclaredFields(); // 获取成员变量对象列表
System.out.println("遍历MyClass类里的所有成员变量的名称:");
for(int i =; i<fields.length; i++) {
System.out.println(fields[i].getName());
}
Constructor [] constructors = c.getConstructors(); // 获取构造函数对象列表
System.out.println("遍历MyClass类里的所有构造函数的名称:");
for(int i =; i<constructors.length; i++) {
System.out.println(constructors[i].getName());
}
}
public static void main(String [] args) {
MyClass myClass = new MyClass(); // 创建一个MyClass对象
printClassMessage(myClass); // 打印这个对象所属类的相关信息
}
}
遍历MyClass类里的所有方法的名称:
getValue
setValue
遍历MyClass类里的所有成员变量的名称:
value
遍历MyClass类里的所有构造函数的名称:
mypackage.MyClass
上面的例子仅仅是作为一个展示,Method/Field/Constructor对象的API当然不仅限于getName这样获取名称的简单操作,所以接下来我将分别介绍更具体的反射API
利用反射API分析类中方法信息
getMethods和getDeclaredMethods方法
getValue
setValue
import java.lang.reflect.Method;
public class Test {
public static void printMethodsMessage (Object obj) {
Class c = obj.getClass();
Method [] methods = c.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
public static void main(String [] args) {
MyClass myClass = new MyClass();
printMethodsMessage(myClass);
}
}
getValue
setValue
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
通过method.getReturnType()获取方法返回值对应的Class对象
import java.lang.reflect.Method;
public class Test {
public static void printMethodsMessage (Object obj) {
Class c = obj.getClass(); // 取得obj所属类对应的Class对象
Method [] methods = c.getDeclaredMethods(); // 取得obj所属类中方法对应的Method对象组成的数组
for (Method method : methods) { // 遍历Method对象
String name = method.getName(); // 取得方法名
Class returnClass = method.getReturnType(); // 获取方法返回值对应的Class对象
String returnName = returnClass.getName(); //获取返回值所属类的类名——也即返回值类型
System.out.println(name + "方法的返回值类型是" + returnName);
}
}
public static void main(String [] args) {
MyClass myClass = new MyClass();
printMethodsMessage(myClass);
}
}
getValue方法的返回值类型是int
setValue方法的返回值类型是void
通过method.getParameterTypes()获取方法各参数的Class对象组成的数组
public class MyClass {
public void method1 (int a, long b) { };
public void method2 (float a, double b) { };
public void method3 (String str) { };
}
public class Test {
public static void printMethodsMessage (Object obj) {
Class c = obj.getClass(); // 取得obj所属类对应的Class对象
Method [] methods = c.getDeclaredMethods(); // 取得obj所属类中方法对应的Method对象组成的数组
for (Method method : methods) { // 遍历Method对象
String methodName = method.getName(); // 取得方法名
String paramsStr = ""; // 用于存放某个方法参数类型列表的字符串
Class [] paramsClasses = method.getParameterTypes();
for (Class pc: paramsClasses) {
String paramStr = pc.getName(); // 获取当前参数类型
paramsStr+=paramStr + " ";
}
System.out.println(methodName+ "方法的所有参数的类型列表:" + paramsStr);
}
}
public static void main(String [] args) {
MyClass myClass = new MyClass();
printMethodsMessage(myClass);
}
}
method2方法的参数类型列表:float double
method1方法的参数类型列表:int long
method3方法的参数类型列表:java.lang.String
利用反射API分析类中成员变量信息
获取成员变量类型对应的的Class对象
public class MyClass {
private int number = ;
private String name ="彭湖湾";
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void printFieldsMessage (Object obj) {
Class c = obj.getClass(); // 取得obj所属类对应的Class对象
try {
Field field = c.getDeclaredField("name"); // 取得名称为name的field对象
field.setAccessible(true); // 这一步很重要!!!设置为true才能访问私有成员变量name的值!
String nameValue = (String) field.get(obj); // 获取obj中name成员变量的值
System.out.println("MyClass类中name成员变量的值为:" + nameValue); // 输出
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String [] args) {
MyClass myClass = new MyClass();
printFieldsMessage(myClass);
}
}
MyClass类中name成员变量的值为:彭湖湾
通过getType方法读取成员变量类型的Class对象
Field field = class1.getDeclaredField(number");
System.out.print(field.getType().getName());
int
利用反射API分析类中构造器信息
public class MyClass {
public MyClass(int a, String str){}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void printContructorsMessage (Object obj) {
Class c = obj.getClass(); // 取得obj所属类对应的Class对象
Constructor [] constructors = c.getDeclaredConstructors();
for (Constructor constructor : constructors) {
Class [] paramsClasses = constructor.getParameterTypes();
String paramsStr = "";
for (Class pc : paramsClasses) {
String paramStr = pc.getName();
paramsStr+=paramStr + " ";
}
System.out.println("构造函数的所有参数的类型列表:" + paramsStr);
}
}
public static void main(String [] args) {
MyClass myClass = new MyClass(, "彭湖湾");
printContructorsMessage(myClass);
}
}
构造函数的所有参数的类型列表:int java.lang.String
利用反射动态加载类,并用该类创建实例对象

NotExistClass cannot be resolved to a type

Class classInstance = Class.forName("mypackage.MyClass");
MyClass myClass = (MyClass) classInstance.newInstance();
public class Test {
public static void main(String [] args) {
try {
Class classInstance = Class.forName("mypackage.MyClass");
MyClass myClass = (MyClass) classInstance.newInstance();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【java】java反射初探 ——“当类也照起镜子”的更多相关文章
- 【java】java反射初探 ——“当类也学会照镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制就是: 提供一套完善而强 ...
- Java反射初探 ——“当类也学会照镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制就是: 提供一套完善而强大的 ...
- java通过反射取得一个类的完整结构
首先我们在person包中新建一个Person.java: package person; import sex.Sex; public class Person{ private String na ...
- java利用反射打印出类的结构
1 输入一个类名:java.lang.String将打印出String类定义的结构,例如: public final class java.lang.String { public java.lang ...
- Java通过反射机制修改类中的私有属性的值
首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username ...
- Java关于反射
反射的概念:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
- 七分钟理解 Java 的反射 API
像java一样,一种具有反射功能的语言.允许开发人员在运行时检查类型.方法.字段.注解等,并在程序运行时决定是否使用. 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他. 使用它 ...
- java 深入技术七(类的结构和反射)
1.java反射(reflect) java 类的结构 java反射机制就是把java类按结构分解,每一部分对应特定的反射类 java反射机制允许运行时加载,探知和使用在编译期间完全未知的classe ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
随机推荐
- Callable+Future+newFixedThreadPool的应用
最近在处理很多的数据,数据量比较大,但是处理的相对简单一些,没有什么复杂的业务逻辑,然后就使用了多线程去处理.因为一直停留在Thread和Runnable的知识中,项目中使用Callable,刚好可以 ...
- Vim中常用的命令行
Vim中常用的命令行... ------------------- 一些真正强大的武器总不是那么容易驾驭的,主角总得付出一些努力才能收获到更加强大的力量,对于 Vim 这种上古神器来说更是如此.由于它 ...
- MySQL插入、更新、删除数据
1.插入数据:由于下表的id会自增,故赋值null. 注意:字符串用' '单引号,不能双引号,英文状态下. 可以写上部分属性名进行插入操作,如bookTypeId没写,默认NULL. 也可以写上所 ...
- XMind入门教程
最近在总结一些框架知识的时候,总找不到一款好的软件来画流程图,后来在网上查找这方面的东西,找到了 XMind,发现用来画思维导图还挺好的,看起来思路清晰,美观.那么便将使用的一些经验分享给大家. 1. ...
- 【RN6752】模拟高清AHD芯片或成为车机新标配
由于目前车机方案倒车后视目前大多为480P标配,画面噪点多有锯齿成像效果差,成为行业的难言之痛.2012年底,浙江大华宣布发布一项具备完全自主知识产权的安防行业高清视频传输规范--HDCVI--Hig ...
- node.js 89行爬虫爬取智联招聘信息
写在前面的话, .......写个P,直接上效果图.附上源码地址 github/lonhon ok,正文开始,先列出用到的和require的东西: node.js,这个是必须的 request,然发 ...
- java与32/64位虚拟机
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt232 32位电脑与64位电脑有什么不同? 我们通常说的64位技术是相对于32 ...
- R0~R16寄存器作用(转)
R0-R3 用作传入函数参数,传出函数返回值.在子程序调用之间,可以将 r0-r3 用于任何用途. 被调用函数在返回之前不必恢复 r0-r3.如果调用函数需要再次使用 r0-r3 的内容,则它 ...
- [js高手之路]Node.js模板引擎教程-jade速学与实战1
环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...
- 团队作业8——第二次项目冲刺(Beta阶段)第三天
BETA阶段冲刺第三天 1.当天站立式会议 2.每个人的工作 (1)昨天已完成的工作: 编写页面讨论 (2)今天计划完成的工作: 完成编写页面 (3)工作中遇到的困难: 验证码正确度 (4)每个人的贡 ...