java 反射机制 笔记

一,什么是反射机制  

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

简单一点说:只要给我类的全名称(包名+类名),就可以使用该类的属性,方法,构造方法。

(以下方法来自Class类)
二,获取构造方法常用方法

Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 

三,获取属性常用方法

Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

四,获取方法

Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

做一下总结: 

带有Declared的方法可以获取所有权限修饰的要反射类的方法方法属性构造方法
      不带有Declared的方法只能获取到public修饰的要反射类的方法

下面看一下代码:

我们要对Person类进行反射

package cn.haoju.reflections;

public class Person {

    private String name;
    private int age;

    private Person() {

    }

    private Person(String name) {
        this.name = name;
    }

    @SuppressWarnings("unused")
    private void sayHello() {
        System.out.println("say hello");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }    

}

获取构造方法:

package cn.haoju.reflections;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ConstructorDemo {

    public static void main(String[] args) throws Exception {
        String className = "cn.haoju.reflections.Person";//Person类的全名称
        Class pClass = Class.forName(className);
         getDeclaredConstructors(pClass);
         getDeclaredConstructor(pClass);
         getConstructors(pClass);
         getConstructor(pClass);
    }

    /**
     *  获取公共的指定参数的构造方法
     * @param pClass
     * @throws NoSuchMethodException
     */
    private static void getConstructor(Class pClass)
            throws NoSuchMethodException {
        Constructor constructor = pClass.getConstructor(String.class);
        System.out.println(constructor);//为空
    }

    /**
     * 获取公共的所有构造方法
     * @param pClass
     */
    private static void getConstructors(Class pClass) {
        Constructor[] constructors = pClass.getConstructors();
        for(Constructor constructor : constructors) {
            System.out.println(constructor);//为空
        }
    }

    /**
     * 通过制定的构造方法参数来获取被反射对象的实例
     *
     * @param pClass
     * @throws Exception
     */
    private static void getDeclaredConstructor(Class pClass) throws Exception {

        Constructor constructor = pClass.getDeclaredConstructor(String.class);
        System.out.println(constructor);
        // private cn.haoju.reflections.Person(java.lang.String)
        constructor.setAccessible(true);// 取消 Java 语言访问检查
        Object obj = constructor.newInstance("lihao");// IllegalAccessException
        System.out.println(obj);
        //打印的数据
        // Person [name=lihao, age=0]
    }

    /**
     * 通过getDeclaredConstructors 获取构造方法
     * @param pClass
     */
    private static void getDeclaredConstructors(Class pClass) {
        Constructor[] constructors = pClass.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        //打印的数据
        // private cn.haoju.reflections.Person(java.lang.String)
        // private cn.haoju.reflections.Person()

    }

}

获取字段:

package cn.haoju.reflections;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class FieldDemo {

    public static void main(String[] args) throws Exception {
        String className = "cn.haoju.reflections.Person";
        Class<?> pClass = Class.forName(className);
        getDeclaredFields(pClass);
        getFields(pClass);
        setField(pClass);
    }

    /**
     * 设置指定的属性  值
     * @param pClass
     * @throws Exception
     */
    private static void setField(Class<?> pClass) throws Exception {        

        //获取空的构造方法
        Constructor constructor = pClass.getDeclaredConstructor(null);
        constructor.setAccessible(true);
        //得到Person实例
        Object obj = constructor.newInstance(null);

        //设置name 属性值
        Field field = pClass.getDeclaredField("name");
        field.setAccessible(true);//取消java语言的异常检查
        field.set(obj, "李浩");        

        //设置age 属性值
        Field ageField = pClass.getDeclaredField("age");
        ageField.setAccessible(true);
        ageField.set(obj, 12);

        System.out.println(obj);//Person [name=李浩, age=12]
    }

    /**
     * 获取公有的
     * @param pClass
     */
    private static void getFields(Class<?> pClass) {
        Field[] fields = pClass.getFields();
        for(Field field : fields) {
            System.out.println(field);
        }
    }

    /**
     * 获取所有的属性
     * @param pClass
     */
    private static void getDeclaredFields(Class<?> pClass) {
        Field[] fields = pClass.getDeclaredFields();
        for(Field field : fields) {
            System.out.println(field);
        }

        //获取到的字段命名
       // private java.lang.String cn.haoju.reflections.Person.name
       // private int cn.haoju.reflections.Person.age
    }

}

获取方法:

package cn.haoju.reflections;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class MethodDemo {
    public static void main(String[] args) throws Exception {
        String className = "cn.haoju.reflections.Person";
        Class pClass = Class.forName(className);

        getDeclaredMethods(pClass);

        userMethod(pClass);
    }

    /**
     * 反射方法是用
     * @param pClass
     * @throws Exception
     */
    private static void userMethod(Class pClass) throws Exception {
        //工作构造方法拿到Person实例
        Constructor constructor = pClass.getDeclaredConstructor(null);
        constructor.setAccessible(true);
        Object person = constructor.newInstance(null);

        Method method2 = pClass.getDeclaredMethod("sayHello", null);
        method2.setAccessible(true);
        method2.invoke(person , null);//执行该方法 say hello

        Method method3 = pClass.getDeclaredMethod("setName", String.class);
        method3.invoke(person, "lisan");
        Method method4 = pClass.getDeclaredMethod("getName", null);
        Object retrun = method4.invoke(person, null);//返回retrurn的结果
        System.out.println(retrun); //lisan
    }

    /**
     * 获取该反射类的所有的公共方法(包括父类的)
     * @param pClass
     */
    private static void getMethods(Class pClass) {
        Method[] methods = pClass.getMethods();
        for(Method method:methods) {
            System.out.println(method);
        }

//        public int cn.haoju.reflections.Person.getAge()
//        public void cn.haoju.reflections.Person.setAge(int)
//        public java.lang.String cn.haoju.reflections.Person.toString()
//        public java.lang.String cn.haoju.reflections.Person.getName()
//        public void cn.haoju.reflections.Person.setName(java.lang.String)
//        public final native java.lang.Class java.lang.Object.getClass()
//        public native int java.lang.Object.hashCode()
//        public boolean java.lang.Object.equals(java.lang.Object)
//        public final native void java.lang.Object.notify()
//        public final native void java.lang.Object.notifyAll()
//        public final void java.lang.Object.wait() throws java.lang.InterruptedException
//        public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
//        public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException

    }

    /**
     * 获取改反射类的所有的方法
     * @param pClass
     */
    private static void getDeclaredMethods(Class pClass) {
        Method[] methods = pClass.getDeclaredMethods();
        for(Method method:methods) {
            System.out.println(method);
        }
//        private void cn.haoju.reflections.Person.sayHello()
//        public int cn.haoju.reflections.Person.getAge()
//        public void cn.haoju.reflections.Person.setAge(int)
//        public java.lang.String cn.haoju.reflections.Person.toString()
//        public java.lang.String cn.haoju.reflections.Person.getName()
//        public void cn.haoju.reflections.Person.setName(java.lang.String)
    }
}

java 反射基本使用就这么多了

时间: 2024-10-06 03:21:11

java 反射机制 笔记的相关文章

Java反射机制--笔记

1.认识Class类 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式. 1 /*java 反射机制*/ 2 // 获取类的方法 3 UserDao userDao = new UserDao(); 4 Class c = UserDao.class; // 1.知道类名 使用.class获取类 5 Class d = userDao.getClass(); // 2.知道对象 使用.getClass()获取类 6 Class m = null; // 3.知道类 使用class

java反射机制笔记

概念:类和对象之间的关系-->类是对象的一种描述,对象是一类实物的一个具体实例子 反射:得到元数据的行为,得到类 中所有成员和行为德尔一种机制 Class是对一切类的行为和状态的抽象 Class类:用于描述一切类/接口/枚举/注解,枚举是一种类,注解是一种接口. Class实例:就是指JVM(java虚拟机)中的一份字节码, 为了明确区分Class实例表示的是哪个类的字节码.Class类提供了泛型. 1.对象有编译类型和运行类型: Object obj = new Date(); 编译类型为:O

Java语言的反射机制 笔记 摘自 http://blog.csdn.net/kaoa000/article/details/8453371

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. 1.Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类.在运行时构造任意一个类的对象.在运行时判断任意一个类所具有的成员变量和方法.在运行时调用任意一个对象的方法 2.Reflection 是Java被视为动态(或准动态)语言的一个关键性质.

Java反射机制学习笔记

Java反射机制 简介 通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理可以原生实现AOP中的方法拦截功能.通过反射获取到的Java类内部结构后再进行运用,和直接运用这个类效果相同,但额外的提供了运行时刻的灵活性.反射的最大一个弊端是性能比较差.相同的操作,用反射API所需的时间大概比直接的使用要慢一两个数量级.可以考虑在适当的时机来使用反射API. 基本用法 Java反射机制主要有两个作用.第一个主要作用是获取程序再运行时刻的内部结构.只需要少量的代码就能便利出一个J

通过案例一步学习理解java反射机制

java 反射机制 以下只是个人在学习反射过程中的笔记,如有错误请指出纠正. 1. 通过例子理解反射 获取类的类类型的三种方法 package Reflect; public class ClassReflect { public static void main(String[] args) { ClassReflect cr = new ClassReflect(); //方法一: Class c = cr.getClass(); //方法二: Class c1 =ClassReflect.

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

Java反射机制大神必学系列之 ,高级与低级的差别在哪里?java学习爱好者 2019-05-20 19:08前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文Java反射机制定义 Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.

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 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的