Java反射机制

简介: java反射机制给我们在开发中带来了很多的便利,下面是我在imooc上看到的一些知识点的总结,第一个代码:package com.tiger.reflect;public class ExampleOne { public static void main(...

java反射机制给我们在开发中带来了很多的便利,下面是我在imooc上看到的一些知识点的总结,第一个代码:

package com.tiger.reflect;

public class ExampleOne {
    public static void main(String[] args)  {

        //方法1:当已知类的名称的时候,可以直接获得其实例
        Class model1=Model.class;

        //方法2:当已知一个该类的对象的时候
        Class model2=model1.getClass();

        System.out.println(model1==model2);

        //方法3:当已知该类的一个实例的时候,使用该方法也可以直接获取该类的一个实例
        Class model3=null;
        try {
            model3=Class.forName("com.tiger.reflect.Model");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("不管是哪种方式获得的类的实例,他们其实都是类类型(class type)的表现"
        +"一个类仅仅是java.lang.Class的对象,它不可能有两种类型,所以获得的只是同一个实例:");
        System.out.println("model1==model2?"+(model1==model2));
        System.out.println("model1==model3?"+(model2==model3));
    }

}

class Model {}

2、我们在编写java代码的时候一般会经过先编译,再运行的过程,但是这就会导致一个问题,那就是使用new 方式只能够静态的加载,这样就会有一个弊端,那就是假如说我有N个类,但是中间只有一个是错误的,或者说没有这个类,那么采用new方式就不能编译通过,那么我所有的类都将不能正常的使用,这就不好了。所以可以采用反射机制,进行动态的加载我们所需要的类,这样就不会出现我们遇到这种情况了。那就是Class c=Class.forName(“类的全名”);然后进行强制的类型(前提是这个类型是我们要用的类的implements的共同遵守的一个标准,这也为今后的功能添加,子类添加奠定了基础)转换即可。

3、对于成员变量,其实它(们)也是对象,万事万物在java中全是对象,至于成员变量就是Field的对象,我们可以使用
Class c=c.class;
Field[] fields=c.getDeclaredFields();
field.getName(),field.getType();
就可以了。

4、对于成员函数,其实它也是对象。我们可以使用
Class c=obj,getClass();
c.getDeclaredMethods();

5、小总结:只要想获取类信息,就要获得类类型如,Class c=object.getClass();

6、方法的获得:思路就是,要是获得某个方法的具体的信息,就要先获取该方法所在的类的类类型,然后使用method.invoke,由此可以获得方法的具体信息了。
Class c=object.getClass();
c.getMethod(name,params);//只是public 方法,也可以使用getDeclaredMethods();
例如,我们有一个叫print的方法,里面有两个int int参数,
就可以如下写:Method method=c.getDeclaredMethods(“print”,new Class[]{int.class,int.class});
或者:
method=c.getDeclaredMethods(“print”,int.class,int.class);//有几个参数就写几个参数,这样也是可以的。
方法反射调用函数的方式就是使用method来进行操作的
当有返回值的时候,Object object=method.invoke(obj,params);//效果和obj.print(10,12);效果是一样的。没有返回值时,返回null;
其中参数obj就是我们要反射的类的实例,是不是并不是那么难啊。

最后一个知识点就是反射操作和泛型的操作是绕过编译阶段的。

目录
相关文章
|
12天前
|
Java 数据库连接 开发者
Java的Shutdown Hook机制:优雅地关闭应用程序
Java的Shutdown Hook机制:优雅地关闭应用程序
19 1
|
14天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。
|
17天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
1天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
12 1
|
2天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
17 4
|
5天前
|
Java 数据安全/隐私保护
java中异常处理机制
java中异常处理机制
11 1
|
5天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
21 0
|
6天前
|
Java API 开发者
解密Java反射机制与动态代理
解密Java反射机制与动态代理
10 0
|
8天前
|
Java 数据库连接 开发者
Java中的异常处理机制详解
Java异常处理是确保程序健壮的关键,涉及Throwable的Error和Exception子类。Error由JVM抛出,不建议捕获;Exception分为检查异常(需要捕获)和未检查异常。处理异常的关键字有try、catch、finally、throw和throws。最佳实践包括捕获具体异常、不吞没异常、释放资源和避免滥用异常。示例展示了如何在main方法中处理IOException,并在finally块中进行资源清理。
12 1
|
12天前
|
缓存 NoSQL Java
17:缓存机制-Java Spring
17:缓存机制-Java Spring
40 5