java反射学习
通过一个对象获得完整的包名和类名
- package reflect;
- public class GetClass {
- public static void main(String[] args) {
- GetClass c=new GetClass();
- System.out.println(c.getClass().getName());
- System.out.println("结果是reflect.GetClass");
- Demo d=new Demo();
- System.out.println(d.getClass().getName());
- System.out.println("结果是reflect.Demo");
- }
- }
- class Demo{
- }
所有类的对象其实都是Class的实例。
实例化class对象
- package reflect;
- public class GetClass {
- public static void main(String[] args) {
- Class<?> demo1=null;
- Class<?> demo2=null;
- Class<?> demo3=null;
- demo1=Demo.class;
- demo2=new Demo().getClass();
- try {
- demo3=Class.forName("reflect.Demo");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- System.out.println("demo1,2,3的值是class reflect.Demo");
- System.out.println("类名称 "+demo1.getName());
- System.out.println("类名称 "+demo2.getName());
- System.out.println("类名称 "+demo3.getName());
- System.out.println("他们的值都是reflect.Demo");
- }
- }
- class Demo{
- }
通过一个类获取其所有的属性
- package reflect;
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- public class hello {
- public static void main(String[] args) {
- /*获取本类的全部属性*/
- Class<?> demo = null;
- /* try {
- demo=Class.forName("reflect.Demo");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } */
- // demo=Demo.class;
- demo=new Demo().getClass();
- //获取某个类所声明的字x段(包括public、private、protected)
- Field[] field=demo.getDeclaredFields();
- for(int i=0;i<field.length;i++){
- //返回修饰符的编码
- int mo=field[i].getModifiers();
- //获取修饰符名称
- String decorate=Modifier.toString(mo);
- //输出修饰符名称
- System.out.println(decorate);
- //获取属性类型
- Class<?> type=field[i].getType();
- //输出属性类型
- System.out.println(type);
- //获取属性名称
- System.out.println(field[i].getName());
- //如果要获取其自身的属性和其父类或者接口的属性,用
- //Field[] field=demo.getFields();这个方法
- }
- }
- }
- class Demo{
- public String name;
- public String age;
- private int id;
- }
输出结果是
- public
- class java.lang.String
- name
- public
- class java.lang.String
- age
- private
- int
- id
通过class调用其他类中的构造函数
- package Reflect;
- import java.lang.reflect.Constructor;
- class Person{
- public Person() {
- }
- public Person(String name){
- this.name=name;
- }
- public Person(int age){
- this.age=age;
- }
- public Person(String name, int age) {
- this.age=age;
- this.name=name;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- @Override
- public String toString(){
- return "["+this.name+" "+this.age+"]";
- }
- private String name;
- private int age;
- }
- class hello{
- public static void main(String[] args) {
- Class<?> demo=null;
- try{
- demo=Class.forName("Reflect.Person");
- }catch (Exception e) {
- e.printStackTrace();
- }
- Person per1=null;
- Person per2=null;
- Person per3=null;
- Person per4=null;
- //取得全部的构造函数
- Constructor<?> cons[]=demo.getConstructors();
- try{
- per1=(Person)cons[0].newInstance();
- per2=(Person)cons[1].newInstance("Rollen");
- per3=(Person)cons[2].newInstance(20);
- per4=(Person)cons[3].newInstance("Rollen",20);
- }catch(Exception e){
- e.printStackTrace();
- }
- System.out.println(per1);
- System.out.println(per2);
- System.out.println(per3);
- System.out.println(per4);
- }
- }
【运行结果】:
[null 0]
[Rollen 0]
[null 20]
[Rollen 20]
关于反射中invoke方法的使用
method.invoke(Object obj, Object args[])
obj是个对象,必须是实例化的对象。args是个用于方法调用的参数,是Object数组,因为参数可能有多个。
Method类代表一个方法,所以invoke(调用)就是调用Method类代表的方法。它可以让你实现动态调用,例如你可以动态的传入参数。
- package reflect;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class Test {
- public static void main(String[] args) {
- String [] names ={"tom","tim","allen","alice"};
- Class<?> clazz=hi.class;
- Method method = null;
- try {
- method=clazz.getMethod("sayHi", String.class);
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- }
- for(String name:names){
- try {
- method.invoke(clazz.newInstance(), name);
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InstantiationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- class hi{
- public void sayHi(String name){
- System.out.println("hi,"+name);
- }
- }
结果
hi,tom
hi,tim
hi,allen
hi,alice
getDeclaredMethod
- public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException
java.lang.Class.getDeclaredMethod()方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。name参数是一个字符串,指定所需的方法的简单名称,parameterTypes参数是一个数组的Class对象识别方法的形参类型,在声明的顺序
例如
- Method realMethod = serviceProcessor.getClass().getDeclaredMethod(methodName,JSONObject.class);
- JSONObject paramJson = (JSONObject) JSONObject.parse(param);
- String data = ((String) realMethod.invoke(serviceProcessor, paramJson));
.class和.getClass的区别 :
出现的时期不同:Class.forName()在运行时加载;Class.class和getClass()是在编译器加载,即.class是静态加载,.getClass()是动态加载。
.getClass()是一个对象实例的方法,只有对象实例才有这个方法,具体的类是没有的。类的Class类实例是通过.class获得的,显然,类没有.getClass()方法。
如:
- protected Logger log=Logger.getLogger(this.getClass());
- protected static final Logger log=Logger.getLogger(HttpUtil.class);
注意this是当前类的实例,static表示是静态的
java反射学习的更多相关文章
- Java反射学习系列-绪论
Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- Java 反射学习笔记
要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...
- Java反射学习:深入学习Java反射机制
一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- java反射学习笔记
1.java反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...
- Java反射学习(java reflect)(二)
ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...
- JAVA反射学习网摘
程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...
随机推荐
- 如何替换orcl实例下的四个数据库
1,drop 数据库对应的用户 2,创建新的表空间 新的用户 3,导入新的数据库 imp grid_sysdb/sagis@klmy file=F:\data\addr_interestpoint.d ...
- [转]redis.conf的配置解析
# redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...
- PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法
擦,一身盗汗.一向的设计信息都在设计图里!竟然坏了,坏了!!!!! 惊.怒.悲 固然可以经由过程数据库当前状况反向工程.然则那么注解.我写的提示这些器材都邑消散. 比来的备份是10天前,恢复也会有必然 ...
- ReactNative之style使用指南
ReactNative中能使用的css样式有哪些呢Valid style props: [ "alignItems", "alignSelf", & ...
- 抓包工具charles的使用
Charles是一款抓包修改工具,数据请求控制容易,操作简单. 下载和安装 首先是工具下载和安装 安装前需要先有Java的运行环境.下载到charles的破解版以后,正常安装.一般破解版里会有char ...
- android Notification 的使用
最近一直在研究 android ,并一边研究一边做应用.其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题.经过研究实现了其功能 ...
- Zxing二维码重复扫描,不退出。
扫描条码,把手机实现类似超市扫描枪之类的连续扫描. private void continuePreview(){ SurfaceView surfaceView = (SurfaceView) fi ...
- C/C++中的结构体
结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 结构体作用 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成 ...
- [CareerCup] 1.2 Reverse String 翻转字符串
1.2 Implement a function void reverse(char *str) in C or C++ which reverses a null-terminated string ...
- [CareerCup] 9.10 Stack Boxes 垒箱子问题
9.10 You have a stack of n boxes, with widths w., heights hir and depths drThe boxes cannot be rotat ...