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

写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下:

引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧。(()为我手记)

什么是反射?

正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象。一个类会有很多组成部分,比如成员变量、成员方法、构造方法等,反射可以通过加载类(加载类是个什么东西?一直搞不清楚),解剖出类的各个组成部分。

为什么要用反射?

我们需要访问一个类的方法或字段的时候,直接new一个该类的对象然后调用就好了,干嘛要用反射呢?刚学的时候我也不懂,并且学了也没机会用到,或者根本用不到,后来开始接触strut2、hibernate等一些框架的时候,才慢慢懂得了一点反射的强大之处。在框架中会有很多配置文件,而配置文件中一般只有一些类的全路径的字符串,而就是通过这些个字符串,就能得到这个类的对象,以及类中所有的信息。我给你这个类,当然你可以轻松得到它的实例,但如果我给你的只是这个类的路径的字符串呢?没有反射你就傻眼了吧。学习反射一般只会在写框架的时候用到,如果你没有达到写框架的高度,能够看懂别人的框架也是极好的。

这里面还涉及到一个静态编译和动态编译(静态编译和动态编译应该是过的,但是忘记了)的概念,前者的意思就是在编译的时候已经绑定了对象,确定了对象;而动态编译就是直到运行的时候,才根据需要去绑定对象。

加载类:

加载类就是获得类的字节码。要想通过反射获取到一个类的内部信息,首先得先获取到这个类的字节码对象。

加载类有三种方式:

现在我有一个类User,我希望加载这个类,获得它的字节码对象:

package cn.ren.reflect2;

public class Demo {

    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式, 通过Class的forName方法,注意使用目标类的全路径
        Class clazz = Class.forName("cn.ren.reflect2.User");

        //第二种方式,通过Object类的getClass()方法
        Class clazz1 = new User().getClass();

        //第三种方式,通过类的.class属性
        Class clazz2 = User.class;
    }

}

一般第一种方式最常用,也最好用,因为看代码我们可以发现,后两种在编译前就必须要知道具体的类的,否则就无法通过编译,而第一种方式,没有那么大的强制性,他只是提供了一个空间,运行时你可以想把谁传给它就把谁传给它,这个类甚至可以不存在,后果只是抛出一个异常。

反射类的方法(Method):

一个类中总会有实现某些功能的方法,这些方法可能有返回值也可能没有返回值,可能有参数也可能没参数,可能是静态方法也可能是普通方法。下面通过例子分别讲解:

package cn.ren.reflect2;

import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) throws Exception {
        User u = new User();
        //通过Class的forName方法,注意使用目标类的全路径
        Class clazz = Class.forName("cn.ren.reflect2.User");

        /*
         * 获取无参无返回值的方法login
         * 获得一个方法名为"login"但是没有参数的Method对象
         */
        Method method = clazz.getMethod("login", null);

        /*
         * 第一个参数:要想执行这个login方法你总得告诉她是哪个User的login方法吧
         * 第二个参数就是login方法的参数(实参),这里为null
         */
        method.invoke(u, null);

        //获取有参有返回值的方法eat
        Method method1 = clazz.getMethod("eat", String.class);
        String agrs = (String) method1.invoke(u, "超人");

        /*
         * 获取带参无返回值的静态方法sleep
         * 静态方法,可以不提供User对象,传一个null即可
         */
        Method method2 = clazz.getMethod("sleep", String.class);
        method2.invoke(null, "蝙蝠侠");
     }
}

打印结果为:

无参构造函数
用户登录了
超人去吃饭了
蝙蝠侠去睡觉了

反射类的字段:

时间: 2024-08-02 07:03:16

浅说Java中的反射机制(二)的相关文章

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

关于JAVA中的反射机制的总结

JAVA中的反射机制是一种能够大大增强程序扩展性的技术.当一个程序封装完成后(生成exe文件),如果想要对该程序进行功能扩展,不用进行代码的从新修改(也不可能拿到源码),只要修改配置文件(一般是XML)就可以完成. 这样的程序为外部提供了一个接口,只要按照该接口的规则定义一个对象(功能),即可以为应用程序扩展该功能. 可以这样比喻,你买了一块电脑主板(封装好的程序),此时你想要添加一块声卡(要扩展的功能),此时只能够通过一个pci接口(应用程序提供的接口)来进行扩展.声卡的接口必须符合PCI的规

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

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.      然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法.      例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPack

黑马程序员【java中的反射机制】

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

Java 中的反射机制

一.什么是Java中的反射: Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法.Java 的这一能力在实际应用中用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息.Reflection 是 Java 被视为动态(或准动态)语言的关键,允许程序于执行期 Reflection APIs 取得任何已知名称之

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

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

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

转载:JAVA中的反射机制

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下看. 二,反射机制的作用:

java中的反射机制_____

一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下看. 二,反射机制的作用: 1,反编译:.class-->.java 2,通过反射机制访问java对象的属性,方法,构造方法等: 这样好像更容易理解一些,下边我们具