获取反射加载类(获取类的字节码)的3种方式:

  • Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
  • Class class2 =new Person().getClass();
  • Class class3=Person.class;

在JAVA中,解剖类Class提供的常用方法:

  • public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public类型构造函数
  • public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取private类型构造函数
      例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");

Constructor c= class1.getDeclaredConstructor(String.class);
c.setAccessible(true); //暴力破解
c.newInstance("张三");
  • public Method getMethod(String name, Class<?>... parameterTypes) 获取类的public类型方法
  • public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类的private类型方法

   例:

Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person)class1.newInstance();
Method method= class1.getDeclaredMethod("Head", String.class);
method.setAccessible(true);//打开访问权限
method.invoke(p, "李四");

获取静态方法并执行:

Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
//Person p=(Person)class1.newInstance();
Method method= class1.getMethod("Head", Integer.class);
method.invoke(null, "李四");

注意:反射调用参数为数组时,反射会进行拆解。例:

Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
//Person p=(Person)class1.newInstance();
Method method= class1.getMethod("main", String[].class);
method.invoke(null, (Object)new String[] {"12"});
//此处需要做参数包装,不做包装,反射会进行拆解数组参数,最终为:main(String s1),
//与期望main(String [] args) 不相同
  • public Field getField(String name) 获取类public类型字段方法。

例:

@Test
public void func7() {
  try {
    Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
    Person p=(Person) class1.newInstance();
    Field name=class1.getField("name");
    //设置字段值:
    name.set(p, "张飞");
    //读取值
    Object object=name.get(p);
    //获取字段类型
    Class type=name.getType();
    if(type.equals(String.class)) {
      String vString=(String) object;
      System.out.println(vString);
    }
    //2 .
    System.out.println(p.getName());
  } catch (Exception e) {
    e.printStackTrace();
  }
}
  • public Field getDeclaredField(String name) 获取private 字段方法。

  例:

@Test
public void func8() {
  try {
    Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
    Person p=(Person) class1.newInstance();
    Field name=class1.getDeclaredField("age");
    name.setAccessible(true);
    //设置字段值:
    name.set(p, 12);
    //读取值
    Object object=name.get(p);
    //获取字段类型
    Class type=name.getType();
    if(type.equals(String.class)) {
      String vString=(String) object;
      System.out.println(vString);
    }
    //2 .
    System.out.println(p.getAge());
  } catch (Exception e) {
    e.printStackTrace();
  }
}

JAVA 中的反射(reflact)的更多相关文章

  1. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  2. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  3. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  4. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  5. java中动态反射

    java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...

  6. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

  7. java笔记十:java中的反射

    Java中,反射是一种强大的工具.它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接.反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而 ...

  8. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  9. java中使用反射获取pojo(实体)类的全部字段值

    说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...

  10. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

随机推荐

  1. CI_CD(jenkins)公司实战_未完成版

    环境准备 #三台服务器,不同的ip centos   镜像时:CentOS Linux release 7.6.1810 (Core) gitlab-ce 版本是:11.11.3 jenkins   ...

  2. Serverless 的开发者工具建设

    本文将介绍 Serverless 生态下的开发者工具,并简述这些工具是如何贯穿开发.调试.测试和部署的生命周期,提升开发者效率的. 由于 Serverless 平台具备弹性扩缩.免运维.按需付费等特点 ...

  3. JS替换变量中的文字字母

    var text='Hello world, Hello world'; var b= text.replace('world','zhengxiaoya'); // 找到字符串中的第一个'world ...

  4. IPC|同族专利|专利法|Soopat|专利之星|derwent innovations index|espacenet|j-piatpat|

    信息检索: 同族专利是基于同一优先权文件,在不同国家或地区,以及地区间专利组织多次申请.多次公布或批准的内容相同或基本相同的一组专利文献.同族专利检索用于同一个专利在其他国家的申请情况,查看类似专利的 ...

  5. A 小石的签到题

    题目链接:https://ac.nowcoder.com/acm/contest/949/A 思路: 这题明确的说了是个签到题,但是一直怀疑不是签到题,是唬我的,结果仔细想了想真是这么回事. 每个人必 ...

  6. “冰桶挑战”之外:微软科技助力ALS患者

    编者按:"直到ALS出现治疗方法,科技就是我的解药."ALS患者,前美国橄榄球联盟(NFL)球员Steve Gleason如是说.最近,一支微软首届黑客马拉松(Hackathon) ...

  7. <JZOJ5943>树

    一开始t了五个点我就一脸懵逼 然后 发现高级操作... 就是那个tor的数组2333 可以让一些不需要改的不再去改啦 位运算果然是神奇的东西XD 魔性哈哈哈 #include<cstdio> ...

  8. signals function|KNN|SVM|average linkage|Complete linkage|single linkage

    生物医疗大数据 存在系统误差使得估计量有偏,如下图红色和蓝色图形,存在随机误差使得估计量并不是同一个值,如图中除去期望之外的曲线值,为了控制随机抽样造成的误差,可以使用p-value决定是否服从假设检 ...

  9. 用css3实现图片的放大缩小

    记录一个公用的css实现图片的放大缩小 @keyframes scaleDraw { /*定义关键帧.scaleDrew是需要绑定到选择器的关键帧名称*/ 0%{ transform: scale(1 ...

  10. Pandas写excel总结:写入多个sheet、1个sheet写入多行、向已有sheet追加数据

    1.最简单最基础的写:1excel1sheet df.to_excel("test.xlxs") 2.在一个excel文件里面写入多个sheet writer=pd.ExcelWr ...