目录

  • 反射机制与什么用
  • 反射机制相关的类
  • 获取类的字节码三种方式
    • 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反射和反编译相关推荐

  1. java的反射和反编译机制介绍

    <JAVA啃骨头>之 Java SE 章节 java的反射和反编译机制介绍 一 .什么是java反射机制 JAVA反射机制是指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和 ...

  2. 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)

    Java Decompiler是Java语言的反编译工具,具体介绍见博客Java Decompiler(Java反编译工具) 1.下载插件 Eclipe的Java Decompiler插件名为JD-E ...

  3. java class文件反编译 去掉无用注释

    java class文件反编译之后 有一些没有用的注释 在myEclipse中使用正则表达式 /\*(.*)\*/

  4. Java class 文件反编译工具JD-GUI下载安装使用教程(好用)

    多少个日日夜夜上线系统.都会有明明我改成了最新代码咋没变呢这咋整,看看反编译后的文件吧.每次看完都哦的 豁然开朗. 简介: JD-GUI是java class反编译软件上线的时候很有用.开发这么多年找 ...

  5. 一些防止 Java 代码被反编译的方法

    欢迎关注方志朋的博客,回复"666"获面试宝典 由于Java字节码的抽象级别较高,因此它们较容易被反编译.本节介绍了几种常用的方法,用于保护Java字节码不被反编译.通常,这些方法 ...

  6. 面试被问 | 防止 Java 代码被反编译的方法有几种?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 由于Java字节 ...

  7. Java字节码反编译工具

    jd-gui-0.3.3.windows.zip是一个JAVA字节码(.class文件)反编译的工具, 试了一下感觉挺好用的的.下载地址: http://ishare.iask.sina.com.cn ...

  8. java字节码反编译_javap 反编译 java 字节码文件

    概述: javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析. 语法: 把java文件编译为class文件:javac  T ...

  9. java中如何反编译class文件

    作为一个软件开发人员,在自学的成长道路上,不可避免的会借鉴别人开发完成的功能实现方法,js/css/html可以通过浏览器直接捕获,没有源码的能拿到calss文件也是一件幸事,那么如何查看class文 ...

最新文章

  1. Datawhale赛事大满贯来了!
  2. python怎么找资源_新手Python学习资源哪里找好呢 视频?
  3. 来吧!我教你画真正的流程图
  4. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
  5. Maven(4)--POM配置
  6. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...
  7. 几台WEB经常宕机,求分析原因
  8. plsql查看用户权限_权限功能
  9. memcached学习笔记(1)——memcached原理
  10. mysql 日期与索引问题
  11. (8)Redis-Cluster集群理论及实践【中】
  12. 【优化算法】粒子群优化灰狼算法【含Matlab源码 006期】
  13. VMware Workstation 15 Player 社区版安装教程
  14. 请教modelsim中vlog的用法
  15. 怎样P漫画脸?这三个简单方法分享给你
  16. 如何在U-Boot中添加自定义命令
  17. [Ubuntu]MW150us-rtl8188eu 驱动编译安装
  18. Jess 7.2p2——Java平台规则引擎官方文档翻译1
  19. 进军数字货币新业务,500.com能否“涅槃”重生?
  20. winds Server2016安装mysql8.0版教程

热门文章

  1. 毕业设计 基于单片机的数字出租车计价器
  2. phpadmin 导出csv格式的数据处理
  3. GhostNet详解及代码实现
  4. php nbl2,NBL二年级新军杀入总决赛 虽败犹荣已创造历史
  5. Stack的概念和算法应用
  6. 切比雪夫不等式例题讲解_2019高考数学大题押题(名师视频讲解,高考最后的提分机会)...
  7. git Please tell me who you are怎么处理解决
  8. 我的电脑中的搜索功能用不了怎么办?
  9. 25匹马,5个跑道,每次只能跑5匹,用最少的次数选出最快的前3匹
  10. 阿里云服务器centos8系统安装Tomcat9