java反射机制
来源:互联网 发布:分水岭算法的大米图 编辑:程序博客网 时间:2024/06/03 19:29
最近在学一些框架,然后又把java的反射拿来看了看,通过学习视频和别人的博客对反射有了新的理解。
在之前如果问我什么是反射我会毫不犹豫地告诉你我知道,我在jdbc连接数据库的时候用过反射。
现在想想真的挺天真的。就总结了下面的文章,如有不正请指正。
我就不说java反射的概念了,因为概念看了像天书一样。1:java反射作用:
①:反编译 .class文件--->.java文件
②:通过反射机制访问java对象的属性方法以及构造方法。
2:什么是Class?
java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关java中Class类的相关知识!
java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息。
当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象对被装入类的详细信息进行访问。
一般获取类有三种方法:
//方法一
Class c1=Class.forName("java.lang.String");//方法二
Class c2=User.class;//其中User是一个类//方法三
Class c2=User.class;//其中User是一个类3:创建对象
我们上面已经讲了获取类的方法,那么我们要做就是创建他的对象。
Class c1=Class.forName("User"); Object o=c1.newInstance();//此句会调用User的无参构造方法4:获取类中的属性,方法以及变量类型
①:获取方法
Class c1=Class.forName("User"); Object o=c1.newInstance();//此句会调用User的无参构造方法②:获取属性(Field)
User类
public class User { private String id; public int age; protected String addr; boolean sex; }获取属性的类
public class User { private String id; public int age; protected String addr; boolean sex; }//获取所有类型的属性
Field [] fs=c.getDeclaredFields(); for(Field field:fs) { int i= field.getModifiers(); String string =Modifier.toString(i); System.out.println(string); //因为我们获取的String等属性都是一个类,所以返回值的类型就是类的类Class Class type =field.getType(); System.out.println(type.getSimpleName()); System.out.println(field.getName()); } }
那么如果我们想输出像User类这样的结果需要怎么做呢?
代码
Class c =Class.forName("User"); Field [] fs=c.getDeclaredFields(); StringBuffer sb=new StringBuffer(); sb.append(Modifier.toString(c.getModifiers())+"class"+c.getSimpleName()+"{\n"); for(Field field:fs) { sb.append("\t"); sb.append(Modifier.toString(field.getModifiers())+" "); sb.append(field.getType().getSimpleName()+" "); sb.append(field.getName()+";\n"); } sb.append("}"); System.out.println(sb);
③:获取类中的构造方法:
Class c =Class.forName("java.lang.String"); Constructor[]cs=c.getConstructors(); for(Constructor con:cs) { //获取修饰符 System.out.println(Modifier.toString(con.getModifiers())); //获取构造方法名 System.out.println(c.getName()); //构造方法的形式列表 Class[] parameterTypes = con.getParameterTypes(); for(Class cla:parameterTypes) { System.out.println(cla.getSimpleName()); } }
5:反编译举例
我们来反编译String
代码如下
Class c =Class.forName("java.lang.String"); Constructor[]cs=c.getConstructors(); //反编译 StringBuffer sb=new StringBuffer(); sb.append(Modifier.toString(c.getModifiers())+" "+"class"+c.getSimpleName()+"{\n"); for(Constructor con:cs) { sb.append("\t"); sb.append(Modifier.toString(con.getModifiers())+" "); sb.append(c.getSimpleName()+"("); //形参 Class [] para=con.getParameterTypes(); for(int i=0;i<para.length;i++) { Class para1=para[i]; if(i==para.length-1) { sb.append(para1.getSimpleName()); } else { sb.append(para1.getSimpleName()+","); } } sb.append("){}\n"); } sb.append("}"); System.out.println(sb);
阅读全文
1 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- zoj 2110 奇偶性剪枝
- 请教!!linux上的mysql无法登陆问题!
- SpringMvc入门到开发(一)之入门小程序
- Android Scroller完全解析,关于Scroller你所需知道的一切
- BZOJ 1269 [AHOI 2006] STL(rope)\SPLAY 解题报告
- java反射机制
- 搭建数据库时的笔记;
- Java菜鸟教程 标识符
- 得到一个随机字符[A-Z]or[a-z] (大小写也要随机),并打印
- 数组遍历——iterator接口和for方法
- 初学Mybatis
- oracle
- 4399游戏校招笔试题
- python在web.py运行