Java之反射 — 用法及原理

Java之反射 — 用法及原理

定义

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

用途

在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,有时可能会碰到一些情况无法正确的反射,是因为经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。

代码示例

public static void main(String[] args)
            throws ClassNotFoundException,
            IllegalAccessException,
            InstantiationException,
            NoSuchMethodException,
            InvocationTargetException, NoSuchFieldException {

      // 通过反射创建对象
    Class<?> personClass = Class.forName("edu.sfls.Jeff.JavaDev.Person");
    Object obj = personClass.newInstance();
    Person person = (Person) obj;
    person.str1 = "Hello World!";
    person.print_str1();
    // 反射private构造器
    Constructor<?> personConstructor = personClass.getDeclaredConstructor(String.class, String.class);
    personConstructor.setAccessible(true);
    Person person2 = (Person) personConstructor.newInstance("abc", "abcd");
    person2.print_str1_and_2();
    // 反射私有属性
    Field fieldA = personClass.getDeclaredField("a");
    fieldA.setAccessible(true);
    int a = fieldA.getInt(person);
    System.out.println(a);
    // 反射私有方法
    Method methodPrint = personClass.getDeclaredMethod("print_a_b_c", int.class);
    methodPrint.setAccessible(true);
    methodPrint.invoke(person, 100);

}

// 被反射的类
class Person {
    String str1;
    String str2;
    private int a = 1, b = 2, c = 3;

    public Person() {}

    private Person(String str1, String str2) {
        this.str1 = str1;
        this.str2 = str2;
    }

    private void print_a_b_c(int d) {
        System.out.println(a + " " + b + " " + c + " " + d);
    }

    public void print_str1() {
        System.out.println(str1);
    }

    public void print_str1_and_2() {
        System.out.println(str1 + " " + str2);
    }

}

原文地址:https://www.cnblogs.com/jeffersonqin/p/12252615.html

时间: 2024-07-30 03:05:58

Java之反射 — 用法及原理的相关文章

java this的用法以及原理

/** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this.) * 详情参考:Java  static的用法以及原理http://www.cnblogs.com/itcqx/p/5519464.html * 对象调用方法,this的指针指向哪个对象调用该方法那么这个对象的引用的指针就指向this,this就被赋值. * 本示例为了说明this的三种用法!

java的反射机制原理

一  反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制. 二  反射机制的应用: 生成动态代理,面向切片编程(在调用方法的前后各加栈帧). 三  反射机制的原理: 1  首先明确的概念: 一切皆对象----类也是对象. 2  然后知道类中的内容 :modifier  constructor  field  method. 3  其次明白加载: 当An

Java反射及 IoC原理、内省机制

JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性. 1.2 反射机制的作用 在运行时判断任

Java反射机制的原理及在Android下的简单应用

花了几天时间,研究了一下Java的反射机制.在这里总结一下这几天学习的成果,一来分享自己的学习过程和在学习中遇到的问题,二来是给像我一样不太了解Java反射机制的同学做一个简单的介绍.在文章后面会链接一个Android反射机制的应用程序. 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述

Java:反射

初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的内部信息(包括其modifiers(如public, static等).superclass(如Object).interfaces(如Serializable),也包括fields和methods的所有信息),动态地生

理解Java的反射与内省及其区别

java的内省机制和反射机制什么区别 内省操作只针对JavaBean,只有符合JavaBean规则的类的成员才可以采用内省API进行操作....而反射则不同,一个类的所有成员都可以进行反射操作. 内省和反射的操作也有很大不同,内省是先得到属性描述器PropertyDecriptor后再进行各种操作,反射则是先得到类的字节码Class后再进行各种操作的. 反射(reflection)(实现可扩展性智能化) 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对

Java 之 反射

1.反射 a.意义:允许运行中的Java程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性 b.概括:运行时探究和使用编译时未知的类 c.反射的核心原理: ①JVM在加载一个类的时候,会把该类的信息存放到一个Class对象中.该对象又被称之为类模板对象.JVM可以通过检索该对象, 得到这个类所拥有的各种信息(名字.所在包.父类.实现接口.属性.构造.行为......) ②JDK提供API,允许程序员获取到类的Class对象,导致程序员也可以检索到这个类的这些信息,即便这个类

黑马程序员-java基础-反射基础

------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行时更改属性. 那么反射

java 线程基本用法

java中的多线程 一.      java 线程基本介绍 1.进程与线程的区别 进程是指一个内存中运行的应用程序,每个进程都有一块独立的内存空间,一个进程包含一到多个线程. 每个线程都有他所属的进程,每个线程也就是该进程的一条执行路径,线程之间是高频率快速轮换执行的,‘同时’执行只是给人的感觉. 2.Java当中线程一般有5中状态 创建状态:生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 就绪状态:当调用了线程的start方法,线程就进入就绪状态,调用start方法后线