Java--反射机制初探

好多天没写博客 项目刚刚上线 来写一写deom 昨晚复习了一下java的反射机制 写了一个小deom复习下反射机制 代码这东西还是写出来比较爽呀

废话不多说

反射:Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。

也就是说,Java可以加载一个运行时才得知名称的class,获得其完整结构。

这个完整结构是说我们可以通过反射得到里面的任何东西,不管是不是私有的,打破了private,public,protected的各种限制,动态的得到类中的方法

利用反射的步骤以及方法:

第一步:首先得到class文件,可以通过三种方式获得,第一种的Class.forName(“Class”),第二种是通过先new出来一个对象,通过对象去调用自己的class方法,第三种是直接通过类.class方法,都可以得到

第二步:可以通过已经获得的class文件,获得属性,方法,构造函数的方法

第三步:可以选择暴力破解setAccessible(),不然有些private无法得到,然后可以进行逆想做的操作

接下来不说什么,上代码:

首先是测试类Student


public class Student {

    private int age;
    private String name;
    public Student() {

    }
    public Student(int age,String name) {
        // TODO Auto-generated constructor stub
        this.age=age;
        this.name=name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void testPrint(){
        System.out.println("===============通过反射实例化=====================");
    }

}

测试Deom

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Reflect {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        // 第一步 获得得到反射类的方法 有三种
        // 第一种 通过Class.forName(); 第二种 通过getClass 第三种 直接通过类调用.class方法
        Class c1 = Class.forName("Student");
        Class c2 = Student.class;
        Student s1 = new Student();
        Class c3 = s1.getClass();
        /**
         * 当得到class 文件 也就是字节码文件后 便可以得到里面的所有内容,
         * 有两个吸引的地方,一个就是动态加载,一个是可以获得里面所有的内容,而不是通过子类或者new出一个对象
         * 是直接的得到里面的任何东西,不管是public或者是private或者是hide隐藏的方法
         */
        // 第二步 当得到字节码文件之后 可以实例化这个类的对象
        Student student = (Student) c1.newInstance();
        student.testPrint();
        /**
         * 此时输出的结果是 ===============通过反射实例化===================== 也就意味着 如果是实例化
         * 会直接执行无参构造方法
         */
        // 第三步 可以避免构造对象 得到class类中的属性field constructor 构造函数 方法 method
        /**
         * Field 字段 可以获得所有类中的属性 通过getDeclaredFields或者是getFields的方法
         * 前者可以获得的是本类的属性,包含private 后者获得的是本类以及父类的不包含priate属性
         */
        Field[] fs = c1.getDeclaredFields();
        // 定义可变长的字符串,用来存储属性
        StringBuffer sb = new StringBuffer();
        // 通过追加的方法,将每个属性拼接到此字符串中
        // 最外边的public定义
        sb.append(Modifier.toString(c1.getModifiers()) + " class "
                + c1.getSimpleName() + "{\n");
        // 里边的每一个属性
        for (Field field : fs) {
            sb.append("\t");// 空格
            sb.append(Modifier.toString(field.getModifiers()) + " ");// 获得属性的修饰符,例如public,static等等
            sb.append(field.getType().getSimpleName() + " ");// 属性的类型的名字
            sb.append(field.getName() + ";\n");// 属性的名字+回车
        }
        sb.append("}");
        System.out.println(sb);
        /**
         * 每个field可以拿出来 然后通过setAccessible(true)让private方法进行破解,从而进行设置,绕过对象得到
         */
        Field age = c1.getDeclaredField("age");
        age.setAccessible(true);// 我可以称之为暴力破解么
        age.set(student, 10);
        System.out.println(student.getAge());// 此时的输出是10 是不是感觉很神奇 哈哈哈哈
    }
    /**
     * 其他的构造函数 方法等都是类似的步骤 注意: 最好是通过setAccessible()的方法进行暴力破解 不然如果是private的会报异常
     * 得到method之后,需要involve一下
     */

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 18:12:55

Java--反射机制初探的相关文章

java反射机制初探

反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍: Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal pro

初探Java反射机制

反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序库.这项功能被大量地应用于JavaBeans中.反射机制提供了在运行状态中获得和调用修改任何一个类的属性和方法的能力. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 首先让我们来看一个简单的小程序,感性的认识一下Java反射机制: 1 import java.lang

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用

java反射机制分析

本文转自:http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html 浅显易懂,值得收藏 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象, 都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制.反射的概念是由Smith在1982年 首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了

java 反射机制:运行时的类信息(为框架服务的Bug存在)

反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 换一种引出反射的说法是:当通过反射与一个未知的类型的对象打交道是,JVM只是简单地检查这个类,看它是属于哪个特定的类(就想RTTI那样).在用它做其他事情之前必须先加载那个类的Class对象.因此,那个类的.class文件对于JVM来说必须是可获取的:那么在本地机器上,要么通过网络获得

工厂类分离与java反射机制

网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录 加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我 黙言 加博友   关注他 他的网易微博 最新日志 Javascript 操作select控件 Oracle 存储过程基本语法 将域名和tomcat6进行绑定的 svn 423 Locked JS的trim()方法 jbpm4.4 结束流程时报错 随机阅读 让员工每年有一次机会当主角 外国女性如何舍身"套"色狼 亚洲电