java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
1 package com.www.invoke; import java.lang.reflect.Method; /**
* 通过反射操作 类的方法
* java的反射 是说的是运行时 。
* 反射的总结:
* 1,每个类都有与之对用的Class对象。
* 2,每个方法都有与之对用的Method对象。
* 3,每个成员变量都有与之对用的Field对象。
* 4,第一步都是获得类对应的Class对象。
* 5,通过反射可以获得私有的成员变量和方法。
* @author Kelly.chen
*
*/
public class InvokeTest { public int add(int a, int b){
return a + b;
} public String getName(String name){
return "My name is "+name;
} public static void main(String[] args) throws Exception {
//获得类对应的的Class对象 方法一
//Class<?> classType = InvokeTest.class;
//获得类对应的Class对象 方法二
Class<?> classType = Class.forName("com.www.invoke.InvokeTest");
//获得InvokeTest 的一个对象 相当于 InvokeTest invokeTest = new InvokeTest();
Object invokeTest = classType.newInstance();
//测试是不是 InvokeTest的对象 结果是 ture
System.out.println(invokeTest instanceof InvokeTest); //获得 add() 方法
//第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数对应
Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); System.out.println(addMethod.getName());
//调用方法
//第一个参数是那个对象的方法,第二个参数是Object类型的可变参数,与方法参数对应
Object object = addMethod.invoke(invokeTest, new Object[]{2, 3}); System.out.println(object); //获得getName()方法
Method getNameMethod = classType.getMethod("getName", new Class[]{String.class});
//调用getName()方法
Object objectName = getNameMethod.invoke(invokeTest, new Object[]{"chenlei"});
System.out.println(objectName);
//得到所有public 方法(包括继承父类的方法)
Method[] methods = classType.getMethods();
for (Method method : methods) {
System.out.println(method.getName());//获得方法的名字
}
}
}
获得私有方法和成员变量
package com.www.invoke; import java.lang.reflect.Field;
import java.lang.reflect.Method; public class PrivateTest { private String address="shanghai"; public int age = 20; protected String school = "北京大学"; private String sayHello(String name){ return "Hello :"+name;
}
public static void main(String[] args) throws Exception { Class<?> classType = PrivateTest.class;
PrivateTest privateTest = (PrivateTest) classType.newInstance();
//可以获得私有的方法,第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数类型对应
Method method = classType.getDeclaredMethod("sayHello", new Class[] { String.class });
//true不再进行访问权限检查,之后就可以访问此私有方法了,false与之相反
method.setAccessible(true);
//调用方法
Object object = method.invoke(privateTest, new Object[] { "chenlei" });
System.out.println(object);
/* -----------------------------调用 成员变量-----------------------*/
//只能获得public 修饰的方法的成员变量
Field ageField = classType.getField("age");
//获得变量的值
int age = ageField.getInt(privateTest);
System.out.println(age);
Field addressField = classType.getDeclaredField("address");
//true不再进行访问权限检查,之后就可以访问此私有变量了
addressField.setAccessible(true);
//获得变量的值
String address = (String) addressField.get(privateTest);
System.out.println(address);
//获得所有public修饰的成员变量
Field[] fields = classType.getFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
总结:
java的反射 是说的是运行时 。
反射的总结:
1,每个类都有与之对用的Class对象。
2,每个方法都有与之对用的Method对象。
3,每个成员变量都有与之对用的Field对象。
4,第一步都是获得类对应的Class对象。
5,通过反射可以获得私有的成员变量和方法。
java的反射的更多相关文章
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
随机推荐
- C#WebBrowrse拦截下载对话框
为了实现这个功能,可算是折腾不少时间,网上搜素出来的结果基本都是如何屏蔽警告对话框.后来请教一个技术大牛(程序员之窗的主要作者Starts_2000),他用C++实现了,他尝试了下C#也没有解决,就忙 ...
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- ActiveMQ 简单搭建
========== ActiveMQ ============== JMS : topic : 一对多: 发布订阅: 不保证数据是否被接受: 不存储topic信息: Queue : 一对一: 点对点 ...
- 在QMainWindow中利用多个QDockWidget构成标签页tab(原创)
功能描述: 在QMainWindow下,使用多个QDockWidget构成可切换,可拖动,可关闭的标签页:标签页的切换由相关联的QAction触发. 实现效果: 代码如下: QDockWidget * ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- Appfuse:第一张表维护
1. 建立表userinfo 列名 描述 UserID 主键.自增 UserName 用户名 Pwd 密码 CreateDate 创建日期 2. 在src/main/resources目录下增加文件h ...
- 最好用的Unity版本控制工具
自从来到现在的公司,负责Unity组开发以来,尝试了各种版本控制工具.从一开始的TortoiseSVN,到后来为了追求逼格使用Git,尝试了Github客户端和SourceTree,发现都有各种不爽. ...
- java 堆栈 理解
Java 中的堆和栈 堆和栈:分为数据结构的堆和栈以及内存中的堆和栈,两种理解应区分开. 数据结构中的堆: 堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权. 堆性质: ...
- 简历生成平台项目开发-STEP2问卷调查结果统计分析
根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...
- 【推荐】CentOS安装Subversion-1.8.11+HTTP协议支持配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 我们需要搭建一个自己的SVN服务器. 此外,搭建好的SVN服务器除了需要支持svn协议外,最好还需要支持HTTP协议和HTTPS协 ...