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 ...
随机推荐
- ImageSharp .NET Core跨平台图形处理库
ImageSharp 是支持.NET Core跨平台图形处理库,ImageSharp是ImageProcessor 的.NET Core跨平台实现. ImageSharp 支持如下操作: 调整大小,裁 ...
- Navisworks API 简单二次开发 (自定义工具条)
在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...
- JavaWeb_day02_登录校验_查询所有员工信息_DeBug
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! WEB_day02 servlet 协议转对象 服务器 ...
- PHP中this,self,parent三个关键字
this,self,parent三个关键字从字面上比较好理解,分别是指这.自己.父亲. this是指向当前对象的指针(姑且用C里面的指针来看吧)self是指向当前类的指针parent是指向父类的指针( ...
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...
- java web学习总结(二十二) -------------------简单模拟SpringMVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- Linux(九)__网络测试
1.确认ip地址.子网掩码.网关是正确的. ifconfig 2.确认局域网是互通的,访问别人的电脑.网关 ping 发送数据包接收数据包,设备是否联通 /etc/sysconfig/network- ...
- datagrid与webAPI的数据交互(ef mvc )
datagride自带分页工具,当使用分页工具的时候,初始化datagride或者带数据提交到API里面时,会以Json对象的形式将数据传递到API控制器里面,当没有过滤条件或者请求参数.和提交参数的 ...
- iOS提交AppStore后申请加急审核
提交审核后进去下面链接申请加急审核链接:https://developer.apple.com/appstore/contact/appreviewteam/index.html 在I would l ...
- 安卓---Toast工具类,有点懒
package com.liunan.myfirstapp.util; import android.content.Context; import android.widget.Toast; /** ...