java反射和反编译
目录
- 反射机制与什么用
- 反射机制相关的类
- 获取类的字节码三种方式
- 1 通过Class类的静态方法获取字节码
- 2 通过类的getClass()方法获取
- 3 通过class属性获取
- 通过反射创建对象
- 获取反射类中的各种属性方法
- 1 获取属性的名字
- 2 获取属性的类型
- 3 获取属性的修饰符
- 4 获取类中的方法和方法的参数
- 通过反射反编译出类
- 获取类路径的方法
- 通过反射调用方法
- 反射的作用
- 1 可以直接从配置文件中读取类名,进而实例化对象
反射机制与什么用
Java可以通过反射操作字节码文件,通过反射机制可以操作代码片段。在java.long.refect包下。
反射机制相关的类
java.lang.refect.Class
代表字节码文件
java.lang.refect.Method
代表字节码中的方法字节码
java.lang.refect.Constructor
代表字节码中的构造方法字节码
java.lang.refect.Field
代表字节码中的属性字节码
如:
public class User{//Classint no;//Fieldpublic User(){//Constructor}public int getUser(){//Method}
获取类的字节码三种方式
1 通过Class类的静态方法获取字节码
Class c1 = Class.forName("java.lang.String");//需要完整类名,带包名
//forName有异常需要处理
c代表着相应的字节码文件。
2 通过类的getClass()方法获取
String s = "abc";
Class c2 = s.getClass();
注意c1和c2指向同一个字节码文件,c1==c2,相同类型字节码在虚拟机方法区只有一份。
3 通过class属性获取
java任何类型都有class属性
Class c3 = int.class;
通过反射创建对象
Class c = Class.forName(str);
Object obj = c.newInstace();
//通过无参数构造方法构造对象,如果没有无参构造就会出错。
//forName会执行类的静态代码块
如果只想执行类的静态代码块,可以用Class.forName。
获取反射类中的各种属性方法
1 获取属性的名字
Class c = Class.forName(str);
Field[] fields = c.getFields();//只能获取公开属性的方法。
Field[] fields1 = c.getDeclaredFields();//能获取所有属性
String name = fields[0].getName();
2 获取属性的类型
Class c = Class.forName(str);
Field[] fields1 = c.getDeclaredFields();//能获取所有属性
Class type = fields1[0].getType();//获取类型
String fieldname = type.getName();//获取类型名字
3 获取属性的修饰符
Class c = Class.forName(str);
Field[] fields1 = c.getDeclaredFields();//能获取所有属性
int i = fields1[0].getModifiers();//注意返回的是int
String modifier = Modifier.toString(i);//获取修饰符名字
4 获取类中的方法和方法的参数
Method[] mm = c.getDeclaredMethods();//获取方法s="";for(Method m :mm){s.append(Modifier.toString(m.getModifiers())+" ");//获取方法类型s.append(m.getReturnType().getSimpleName()+" " );//获取方法返回值s.append(m.getName());//获取方法名字Class[] pp = m.getParameterTypes();//获取方法参数类型for(Class p :pp){s.append(p.getSimpleName());//获取方法参数类型的名字s.append(",");}}
通过反射反编译出类
package homework;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;public class FieldTest {public static void main(String[] args) throws Exception{StringBuilder s = new StringBuilder();Class c = Class.forName("java.lang.String");Constructor con = c.getDeclaredConstructor();Object obj = con.newInstance();System.out.println(obj);s.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{\n");Field[] ff = c.getDeclaredFields();Method[] mm = c.getDeclaredMethods();for( Field f : ff){s.append("\t");s.append(Modifier.toString(f.getModifiers())+" ");s.append(f.getType().getSimpleName()+" ");s.append(f.getName());s.append(";\n");}for(Method m :mm){s.append("\t");s.append(Modifier.toString(m.getModifiers())+" ");s.append(m.getReturnType().getSimpleName()+" " );s.append(m.getName());s.append("(");Class[] pp = m.getParameterTypes();for(Class p :pp){s.append(p.getSimpleName());s.append(",");}s.deleteCharAt(s.length()-1);s.append("){}\n");}s.append("}");System.out.println(s);System.out.println();System.out.println();}
}
获取类路径的方法
获取类路径下类的路径的通用方法
//Thread.currentThread当前线程
//getContexClassLoader获取当前线程的类加载器对象
//getResource()获取资源,默认从类的根路径下
Thread.currentThread.getContexClassLoader.getResource(filename).getPath();
通过反射调用方法
Class user = Class.forName("User");
Object obj = user.newInstance();
Method m = user.getDeclaredMethod(String.class,int.class);//必须给出参数类型
Object retrunvalue = m.invoke("123",3);//必须给出参数
反射的作用
1 可以直接从配置文件中读取类名,进而实例化对象
在不改源代码的情况下,就可以创建任何对象,对扩展开放,对修改关闭。
java反射和反编译相关推荐
- java的反射和反编译机制介绍
<JAVA啃骨头>之 Java SE 章节 java的反射和反编译机制介绍 一 .什么是java反射机制 JAVA反射机制是指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和 ...
- 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)
Java Decompiler是Java语言的反编译工具,具体介绍见博客Java Decompiler(Java反编译工具) 1.下载插件 Eclipe的Java Decompiler插件名为JD-E ...
- java class文件反编译 去掉无用注释
java class文件反编译之后 有一些没有用的注释 在myEclipse中使用正则表达式 /\*(.*)\*/
- Java class 文件反编译工具JD-GUI下载安装使用教程(好用)
多少个日日夜夜上线系统.都会有明明我改成了最新代码咋没变呢这咋整,看看反编译后的文件吧.每次看完都哦的 豁然开朗. 简介: JD-GUI是java class反编译软件上线的时候很有用.开发这么多年找 ...
- 一些防止 Java 代码被反编译的方法
欢迎关注方志朋的博客,回复"666"获面试宝典 由于Java字节码的抽象级别较高,因此它们较容易被反编译.本节介绍了几种常用的方法,用于保护Java字节码不被反编译.通常,这些方法 ...
- 面试被问 | 防止 Java 代码被反编译的方法有几种?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 由于Java字节 ...
- Java字节码反编译工具
jd-gui-0.3.3.windows.zip是一个JAVA字节码(.class文件)反编译的工具, 试了一下感觉挺好用的的.下载地址: http://ishare.iask.sina.com.cn ...
- java字节码反编译_javap 反编译 java 字节码文件
概述: javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析. 语法: 把java文件编译为class文件:javac T ...
- java中如何反编译class文件
作为一个软件开发人员,在自学的成长道路上,不可避免的会借鉴别人开发完成的功能实现方法,js/css/html可以通过浏览器直接捕获,没有源码的能拿到calss文件也是一件幸事,那么如何查看class文 ...
最新文章
- Datawhale赛事大满贯来了!
- python怎么找资源_新手Python学习资源哪里找好呢 视频?
- 来吧!我教你画真正的流程图
- Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
- Maven(4)--POM配置
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...
- 几台WEB经常宕机,求分析原因
- plsql查看用户权限_权限功能
- memcached学习笔记(1)——memcached原理
- mysql 日期与索引问题
- (8)Redis-Cluster集群理论及实践【中】
- 【优化算法】粒子群优化灰狼算法【含Matlab源码 006期】
- VMware Workstation 15 Player 社区版安装教程
- 请教modelsim中vlog的用法
- 怎样P漫画脸?这三个简单方法分享给你
- 如何在U-Boot中添加自定义命令
- [Ubuntu]MW150us-rtl8188eu 驱动编译安装
- Jess 7.2p2——Java平台规则引擎官方文档翻译1
- 进军数字货币新业务,500.com能否“涅槃”重生?
- winds Server2016安装mysql8.0版教程