获取反射加载类(获取类的字节码)的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. 论文翻译——Character-level Convolutional Networks for Text Classification

    论文地址 Abstract Open-text semantic parsers are designed to interpret any statement in natural language ...

  2. RHEL安装神器EPEL

    什么是EPEL? EPEL的全称叫 Extra Packages for Enterprise Linux .EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS.Scie ...

  3. 算法笔记4.2哈希 问题 A: 谁是你的潜在朋友

    题目描述 "臭味相投"--这是我们描述朋友时喜欢用的词汇.两个人是朋友通常意味着他们存在着许多共同的兴趣.然而作为一个宅男,你发现自己与他人相互了解的机会 并不太多.幸运的是,你意 ...

  4. Zblog主题模板自适应手机响应式ZblogPHP简洁博客主题

    Z-blog PHP版本简洁主题模板 特点简洁舒适 手机移动端自适应,完美有利于优化 代码结构利于编辑 对于不懂代码的,也非常适合简答后台简答 PC端侧边栏下拉跟随,无论下面有多长,导航侧边栏都只在左 ...

  5. hibernate多表查询sql,以及所得对象的处理

    String sql ="SELECT id FROM tea WHERE tea.name=? "; SQLQuery query = this.getSession().cre ...

  6. 吴裕雄--天生自然python学习笔记:抓取网络公开数据

    当前,有许多政府或企事业单位会在网上为公众提供相关的公开数据.以 http://api.help.bj.cn/api/均 .cn/api /网站为例,打开这个链接,大家可以看到多种可供调用的数据 . ...

  7. Introduction to Computer Science and Programming in Python--MIT

    学习总结--(Introduction to Computer Science and Programming in Python--MIT) 导论 主题 重新利用数据结构来表达知识 理解算法的复杂性 ...

  8. Differential Calculus

    Taylor's Formula Theorem 1.1. Let \(f\): \(I=(c,d)->\mathbb{R}\) be a n-times differentiable func ...

  9. java5的静态导入import static

    在Java 5中,import语句得到了增强,以便提供甚至更加强大的减少击键次数功能,虽然一些人争议说这是以可读性为代价的.这种新的特性成为静态导入. 1.静态导入的与普通import的区别: imp ...

  10. 创建框架链接--frameset的连接方法

    首先看下小编的目录架构 1.html将作为主页面 2.html将作为目录页面,里面有2个目录,分别是目录一和目录二 3.html为目录一将要链接的页面 4.html为目录二将要链接的页面 然后,看下1 ...