反射、枚举

这篇具有很好参考价值的文章主要介绍了反射、枚举。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 反射的定义:Java的反射机制是在运行状态中,都能对任意的类拿到这个类的所有属性,从而对其进行相应的修改;
  2. 用途:在日常第三方应用开发中,可以通过反射机制来获取某个类的私有成员变量或是方法;主要是用来开发各种通用框架;
  3. 优缺点:

        优

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

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

        2) 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力

        3) 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。

        缺        

        1) 使用反射会有效率问题。会导致程序效率降低。

            具体参考这里:http://www.imooc.com/article/293679

        2) 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 

4.反射相关的类:反射、枚举获取类的相关方法:

方法 用途
getClassLoader() 获得类的加载器
getDeclaredClasses() 返回一个包含该类中所有类和接口类的对象数组
forName(String className) 根据类名返回类对象
newInstance() 创建类的实例
getName() 获得类的完整路径名字

获取类中属性的相关的方法

方法 用途
getField(String name) 获得某个公有的属性对象
getFields() 获得所有公有的属性对象
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields() 获得所有属性对象

获取类中注解相关的方法(了解)反射、枚举

 获得类中构造器相关的方法(以下方法返回值为Constructor相关)反射、枚举

 获得类中方法相关的方法(以下方法返回值为Method相关)

方法 用途
getMethod(String name, Class... parameterTypes) 获得该类某个公有的方法
getMethods() 获得该类所有公有的方法
getDeclaredMethod(String name, Class... parameterTypes) 获得该类某个方法
getDeclaredMethods()

获得该类所有方法

  1. 反射程序示例  

                第一步自然是要获得当前要反射的类的Class对象,这里有三种

//第一种,使用 Class.forName("类的全路径名"); 静态方法。
//前提:已明确类的全路径名。
//第二种,使用 .class 方法。
//说明:仅适合在编译前就已经明确要操作的 Class
//第三种,使用类对象的 getClass() 方法

//以下是代码示例


class Student{
    //私有属性name
    private String name = "bit";
    //公有属性age
    public int age = 18;
    //不带参数的构造方法
    public Student(){
        System.out.println("Student()");
    }

    private Student(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student(String,name)");
    }

    private void eat(){
        System.out.println("i am eat");
    }

    public void sleep(){
        System.out.println("i am pig");
    }
    private void function(String str) {
        System.out.println(str);
    }
    @Override
    public String toString() {
        return "Student{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
    }
}

public class TestDemo {
    public static void main(String[] args) {
    /*
    1.通过getClass获取Class对象
    */
    Student s1 = new Student();
    Class c1 = s1.getClass();
    
    /*
    2.直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
    这说明任何一个类都有一个隐含的静态成员变量 class
    */
    Class c2 = Student.class;
    
    /*
    3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
    但可能抛出 ClassNotFoundException 异常
    */
    Class c3 = null;
    try {
        //注意这里是类的全路径,如果有包需要加包的路径
        c3 = Class.forName("Student");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    //一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的
    //c1,c2,c3进行 equals 比较,发现都是true
    System.out.println(c1.equals(c2));
    System.out.println(c1.equals(c3));
    System.out.println(c2.equals(c3));
    }
}

        在别的包里使用反射机制来获取Studentlei中的属性对象,构造方法和方法等;文章来源地址https://www.toymoban.com/news/detail-432101.html

//所有和反射相关的包都在 import java.lang.reflect 包下面
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectClassDemo {
    // 创建对象
    public static void reflectNewInstance() {
        try {
            Class<?> classStudent = Class.forName("Student");
            Object objectStudent = classStudent.newInstance();
            Student student = (Student) objectStudent;
            System.out.println("获得学生对象:"+student);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    // 反射私有的构造方法 屏蔽内容为获得公有的构造方法
    public static void reflectPrivateConstructor() {
        try {
            Class<?> classStudent = Class.forName("Student");
            //注意传入对应的参数
            Constructor<?> declaredConstructorStudent = 
                classStudent.getDeclaredConstructor(String.class,int.class);
            //Constructor<?> declaredConstructorStudent = classStudent.getConstructor();
            //设置为true后可修改访问权限    
            declaredConstructorStudent.setAccessible(true);
            Object objectStudent = declaredConstructorStudent.newInstance("张三",15);
            //Object objectStudent = declaredConstructorStudent.newInstance();
            Student student = (Student) objectStudent;
            System.out.println("获得私有构造哈数且修改姓名和年龄:"+student);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    // 反射私有属性
    public static void reflectPrivateField() {
        try {
            Class<?> classStudent = Class.forName("Student");
            Field field = classStudent.getDeclaredField("name");
            field.setAccessible(true);
            //可以修改该属性的值
            Object objectStudent = classStudent.newInstance();
            Student student = (Student) objectStudent;
            field.set(student,"小明");
            String name = (String) field.get(student);
            System.out.println("反射私有属性修改了name:"+ name);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    // 反射私有方法
    public static void reflectPrivateMethod() {
        try {
            Class<?> classStudent = Class.forName("Student");
            Method methodStudent =classStudent.getDeclaredMethod("function",String.class);
            System.out.println("私有方法的方法名为:"+methodStudent.getName());
            //私有的一般都要加
            methodStudent.setAccessible(true);
            Object objectStudent = classStudent.newInstance();
            Student student = (Student) objectStudent;
            methodStudent.invoke(student,"我是给私有的function函数传的参数");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //reflectNewInstance();
        //reflectPrivateConstructor();
        //reflectPrivateField();
        reflectPrivateMethod();
    }
}


到了这里,关于反射、枚举的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java语言----反射、枚举以及lambda表达式

    目录 一.反射 1.1反射的基本情况 1.2反射中最重要的类 1.2.1 Class类 1.2.2Field类 1.2.3Constructor类 1.2.4Method类 1.3反射优缺点  二.枚举 2.1概念 2.2枚举(enum)类方法 2.3枚举的构造 三.Lambda表达式 3.1Lambda介绍 3.2 函数式接口 3.3使用lambda表达式 3.2.1不使用Lambda表达式调用 3.2.2使用Lambda表

    2024年02月08日
    浏览(49)
  • 【数据结构】反射、枚举以及lambda表达式

    Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任 意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信 息以及动态调用对象方法的功能称为java语言的反射

    2024年03月13日
    浏览(40)
  • String、反射、枚举、lambda表达式以及泛型进阶(数据结构系列16)

    目录 前言: 1. String 1.1 字符串常量池 1.1.1 创建对象的思考 1.1.2 字符串常量池(StringTable) 1.1.3 再谈String对象创建 1.1.4 intern方法 2. 反射 2.1 反射的定义 2.2 反射的用途 2.3 反射的基本信息 2.4 反射相关的类 2.4.1 Class类(反射机制的起源) 2.4.1.1 Class类中的相关方法 2.5 反

    2024年02月11日
    浏览(57)
  • 反射 p1 反射机制

    这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码的情况下,来控制程序,也符合设计模式的OCP原则(开闭原则:不修改源码,扩展功能)。 代码演示: re.properties文件: Cat类: ReflectionQuestion: 反射机制允许程序在执行期间借助于Reflection API取得任何类

    2024年02月16日
    浏览(46)
  • 对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理?

    对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理? 比如,你在运行你的代码的时候 它总在python控制台运行,十分难受 在pycharm中设置下即可,很简单 选择运行 点击编辑配置 将使用python控制台运行勾掉 点击保存即可!

    2024年02月11日
    浏览(50)
  • Java笔记040-反射/反射机制、Class类

    目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 代码解释部分 哪些类型有Class对象

    2024年02月09日
    浏览(49)
  • C/C++ 使用 define 实现运行时函数是在哪个文件哪个函数被调用

    我现在需要知道 testFunc 是在哪一行被调用了。 主函数一样 如此就实现了打印函数在娜个文件、哪个函数哪一行被调用的效果 作为 debug 的时候很有用。

    2024年02月17日
    浏览(45)
  • Java反射、代理机制

    官方解释:反射允许对封装类的字段、方法和构造方法的信息进行编程访问。 虚拟机加载类文件后,会在方法区生成一个类对象,包含了类的结构信息,如字段、方法、构造方法等。反射是一种能够在程序运行时动态访问、修改类对象中任意属性的机制(包括private属性)。

    2024年02月10日
    浏览(49)
  • Java反射机制深入详解

    一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private,由JVM创建。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示

    2024年02月06日
    浏览(45)
  • Java的反射机制(2)

    目录 Class类基本介绍 Class类的常用方法 如何获取class类对象 哪些类型有Class对象 Class类基本介绍 在Java语言中,每个对象都有一个运行时类,即其所属的类。而这个运行时类在Java中是以Class类的实例形式存在的,该Class类实例就是所谓的Class对象。Class类表示一个类或接口的元

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包