Java 基础总结--反射的基本操作

一.反射的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

通俗的说,java虚拟机在加载类的时候会找到对应的class文件,并生成一个class对象,每个类class对象只会生成一次,就算是基本数据类型,也会有一个class对象,所以说在java中一切皆对象,这里引入一位博主的图片,我觉得概括的很好

图片来自[https://blog.csdn.net/sinat_38259539/article/details/71799078]

二.反射中使用的方法

1.获取class对象的方法

package Test;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        Student s1 = new Student();
        Class stu1 = s1.getClass();
        System.out.println(stu1.getName());

        Class stu2 = Student.class;
        System.out.println(stu1==stu2);

        //最常用方法
        Class stu3 = Class.forName("Test.Student");
        System.out.println(stu1==stu3);
    }
}
class Student{
}

一般常用第三种方法,第一个都有类的实例了,第二个需要导入类包,第三个forName中的路径为绝对路径。

2.获得类的方法并调用

package Test;

import java.lang.reflect.Method;
public class ReflectTest {
    public static void main(String[] args) throws Exception{
        ReflectTest obj = new ReflectTest();
        Method m1 = obj.getClass().getMethod("age",int.class);
        m1.invoke(obj, new Integer(27));
        m1.invoke(obj, 28);
        Method m2 = obj.getClass().getMethod("age",Integer.class);
        m2.invoke(obj, new Integer(27));
        m2.invoke(obj,28);
    }
    public void age(int age) {
        System.out.println("int age = " + age);
    }
    public void age(Integer age) {
        System.out.println("Integer age = " + age);
    }
}

输出:

int age = 27

int age = 28

Integer age = 27

Integer age = 28

3.获取类信息的系列方法

以Singer类为例子

package Test;
public class Singer {
    public String name;
    public String sex;
    private String song;

    public Singer() {
    }
    public Singer(String name, String sex, String song) {
        this.name = name;
        this.sex = sex;
        this.song = song;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void setSong(String song) {
        this.song = song;
    }

    public String getName() {
        return name;
    }
    public String getSex() {
        return sex;
    }
    public String getSong() {
        return song;
    }
}
package Test;
import java.lang.reflect.*;

public class ReflectTest1 {
    public static void main(String[] args) throws Exception{
        Class clazz = Class.forName("Test.Singer");

    //获得所有方法
    Method[] methods = clazz.getDeclaredMethods();
    for (Method m: methods) {
        System.out.println(m);
    }

    //获取所有成员属性变量
    Field[] fields = clazz.getDeclaredFields();
    for (Field f: fields) {
        System.out.println(f);
    }

    //获取所有构造方法
    Constructor[] constructors = clazz.getDeclaredConstructors();
    for (Constructor c: constructors) {
        System.out.println(c);
    }
  }
}

输出:

    public java.lang.String Test.Singer.getName()
    public void Test.Singer.setName(java.lang.String)
    public java.lang.String Test.Singer.getSex()
    public java.lang.String Test.Singer.getSong()
    public void Test.Singer.setSex(java.lang.String)
    public void Test.Singer.setSong(java.lang.String)
    public java.lang.String Test.Singer.name
    public java.lang.String Test.Singer.sex
    private java.lang.String Test.Singer.song
    public Test.Singer()
    public Test.Singer(java.lang.String,java.lang.String,java.lang.String)

三. 总结

  • 获得Class对象
  • 调用Class的方法
  • 使用反射API来操作信息

原文地址:https://www.cnblogs.com/authetic/p/8972091.html

时间: 2024-10-06 22:42:06

Java 基础总结--反射的基本操作的相关文章

JAVA基础知识|反射

一.理解反射 1.1.基础概念 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. "运行状态",如何理解? "运行状态"体现了反射的应用场景,当一些类,不需要提前加载进JVM内存,而是在运行时根据需要进行加载的时候,就可以通过反射进行动态加载 1.2.如何理解反射? 学习过java的童鞋,肯定对spring.hibernate一

Java基础之—反射

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对

【转】Java基础之—反射

本文章来源:https://blog.csdn.net/sinat_38259539/article/details/71799078.感谢敬业的小码哥的总结. 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反

Java基础增强-反射机制

1 反射机制简介 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法.这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制.反射被视为动态语言的关键. 反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问.检测.修改自身状态与行为的能力.这一概念的提出立刻吸引了编程界的极大关注,各种研究工作随之展开,随之而来引发编程革

Java基础之反射

Java反射是指运行时获取类信息,进而在运行时动态构造对象.调用对象方法及修改对象属性的机制.百度百科的定义:“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 一.反射的用途 Java的反射机制可以做3件事:运行时创建对象.运行时调用方法.运行时读写属性.进而实现以下功能:调用一些私有方法,实现黑科技.比如双卡短信发送.设置状态栏颜色.自动挂电

java基础篇---反射机制

一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反射.通过反射,Java可以于运行时加载.探知和使用编译期间完全求和的类.生成其对象实体,调用其方法或者对属性设值.所以Java算是一个半动态的语言吧. 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方

黑马程序员-Java基础之反射

反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分.1.获得方法包括获得方

java基础:反射机制

一:定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 二:使用场景 一般用在框架的封装上.hibernate.struts都是用反射机制实现的. 举例:JDBC中加载数据库驱动Class.forName("com.mysql.jdbc.Driver"); 三:优点 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的

Java基础之反射(一)

在Java运行时环境中,对于任意一个类,可以知道这个类的属性和方法,实例化对象,而通过实例化的对象获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制.那么反射可以实现什么功能呢? 1.在运行时判断任意一个对象所属的类. 2.在运行时构造任意一个类的对象. 3.在运行时判断任意一个类所具有的成员变量和方法. 4.在运行时调用任意一个对象的方法. 其中,一般而言,开发者社群说到的动态语言,大致认同的一个定义是:"程序运行时,允许改变程序结构或变量类型,这种