JAVA反射其实就是那么一回事

什么是反射

  java反射机制: JAVA反射机制是在运行状态中,

          对于任意一个类,都能够知道这个类的所有属性和方法;

          对于任意一个对象,都能够调用它的任意一个方法和属性;

         这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  简而言之: 就是根据一个已经实例化了的对象来还原类的完整信息

通过反射修改属性

package Test2016.demo;

import java.lang.reflect.Field;

public class Demo4 {

    public static void main(String[] args) throws Exception {

        Student stu = new Student();

        Field[] fields = stu.getClass().getDeclaredFields();

        for (Field f : fields) {
            f.setAccessible(true);  //设置是否允许访问,不写运行会报错

            if (f.getName() == "name") {
                f.set(stu, "java");
            } else if (f.getName() == "age") {
                f.set(stu, 20);
            }
        }
        System.out.println(stu);    //输出:java:20
    }
}

class Student {

    private String name;

    private int age;

    public Student() {
        this.name = "zhangsan";
        this.age = 10;
    }

    //重写toString方法,否则输出:[email protected]
    public String toString() {
        return this.name + ":" + this.age;
    }
}

通过反射调用方法

package Test2016.demo;

import java.lang.reflect.Method;

public class Demo4 {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {

        Student stu = new Student("zhangsan", 21);

        Class c = stu.getClass();

        //getMethod()方法需要传入方法名和方法所带参数的参数类型
        Method method = c.getMethod("score", int.class);

        //invoke()表示调用的意思,需要传入对象和参数
        method.invoke(stu, 100);

        Method m = c.getMethod("say", String.class);
        //这里的null表示不由对象调用,也就是静态方法,把null换位stu也是可行的
        m.invoke(null, "hello java!!!");
    }
}

class Student {

    private String name;

    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void score(int score) {
        System.out.println(this.name + " 考了 " + score + " 分");
    }

    public static void say(String str) {
        System.out.println("刚才我说了:" + str);
    }

    @Override
    public String toString() {
        return this.name + "-" + this.age;
    }
}

程序输出:  zhangsan 考了 100 分
       刚才我说了:hello java!!!

通过反射操作数组

package Test2016.demo;

import java.lang.reflect.Array;

public class Demo4 {

    public static void main(String[] args) throws Exception {

        int[] arr = {1, 2, 3, 4, 5};

        //getComponentType()返回你数组里面装的数据的数据类型的类名称。这里也就是int
        Class<?> c = arr.getClass().getComponentType();    

        System.out.println("数组类型:" + c.getName());    //数组类型:int

        int len = Array.getLength(arr);
        System.out.println("数组长度:" + len);    //数组长度:5

        System.out.print("遍历数组:");

        for (int i = 0; i < len; i++) {
            System.out.print(Array.get(arr, i) + " ");    //遍历数组:1 2 3 4 5
        }

        System.out.println();

        System.out.println("修改第三个数据前:" + Array.get(arr, 2));    //修改第三个数据前:3
        Array.set(arr, 2, 10);
        System.out.println("修改第三个数据前:" + Array.get(arr, 2));    //修改第三个数据前:10
    }
}

 注意点: 

  getFields()与getDeclaredFields()区别:

    getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.

    getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

   getMethods()与getDeclaredMethods()区别:

    getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.

    getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

   getConstructors()与getDeclaredConstructors()区别:

    getConstructors()只能访问类中声明为public的构造函数.

    getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关

    

时间: 2024-10-05 13:04:35

JAVA反射其实就是那么一回事的相关文章

Java 反射在实际开发中的应用

运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本篇博文会结合Thinking in Java 的demo 和实际开发中碰到的例子,对Java反射和获取类型信息做总体上整理.文章主要分为三块: Java类加载和初始化 Java中RTTI Java利用反射获取运行时类型信息 一:Java类加载和初始

Java反射机制的学习

Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Java反射机制没啥用.或许在J2EE.J2SE等平台,Java反射机制没啥用(具体我也不了解,不多做评论),但是在Android应用开发中,该

[转载] Java反射机制的学习

本文转载自: http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法). 也许你使用Java已经很长时间了,可是几乎不会用到Java反射机制.你会嗤之以鼻地告诉我,Ja

[转]Java 反射在实际开发中的应用

一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTTI在运行时如何表示 2.3   :  Class对象 2.3 : RTTI形式总结: 三:Java利用反射获取运行时类型信息 3.1 : 获取的方式 3.2 :   动态代理 四: Java反射在实际开发中应用 4.1  :在web项目中创建统一的拦截层 4.2 : 用于webService服务 :

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

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

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

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

【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