`
leeqq
  • 浏览: 137890 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java反射机制学习

    博客分类:
  • JAVA
阅读更多

对于Java中的反射机制,是早有所闻,也略有所知,这两天有时间再来看看Java反射机制,现将这两天所学记录下来,方便以后查询

       学习Java反射机制,得先了解一个类——Class。Class类是Java反射的开始,她代表了一个类本身,所以通过类Class可以知道一个类的结构,可以知道这个的所有信息,包括属性,方法等等。

       先来看一个最简单的例子

这是一个普通的类,其中的get和set方法省略,四个属性访问权限分别是private,protected,默认,public

public class Car {
    private String name;
    protected String color;
    String model;
    public String brand;
}

 下面提供一个方法,简单看看利用Java的反射机制实现的功能

public void getNormal(Object obj){
        Class classes = obj.getClass();
        Field[] fields = classes.getDeclaredFields();
        for(Field field : fields){
            try {
                field.setAccessible(true);
                System.out.println(field.get(obj));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

 该方法以Object作为参数类型,可以接受任何类型的对象,通过此方法可以打印传入对象的所有属性的值。

 

简单说一下这段代码,

Class classes = obj.getClass();得到一个Class的对象,表示参数对象所属类的本身。

Field[] fields = classes.getDeclaredFields();得到参数对象所有的属性
System.out.println(field.get(obj));这里面的 field.get(obj)  得到参数对象某属性的值。

如果传入这么一个对象car,其属性分别是name:carName; color:carColor;model:carModel;brand:carBrand。那么执行这段方法的结果就是输出

carName

carColor

carModel

carBrand

其实在这个例子中完全不需要类Car有get和set方法。

顺便提一下,对于private级别的属性,在没有相应方法的时候,无法直接更改属性值,例如car.name在程序中是编译报错的,而如果利用反射机制,这里与 get 相对应的有 set 方法

set(Object obj, Object value)      将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

这个时候不管属性什么访问权限,都可以直接更改对应的值。

 

这里要提一下field.setAccessible(true),该方法设置属性是否可见,默认为false,如果不设为ture,那在下面调用field.get(obj) 方法的时候,如果属性的访问权限private,则会抛出异常。在调用set方法的时候也是如此。

通过这个例子已经可以粗略的知道一点Java反射机制了。在运行时动态的操作java对象。

 

下面就介绍一下在运用反射机制中比较常用的几个方法,其实也不难,参考Java API就可以了

首先是如何获得Class对象,有三种方法

1. 类名.class

        如Car.class

2. 对象.getClass()
        如上面例子中写的obj.getClass()
3.Class类的静态方法forName()

        Class.forName("java.lang.Stirng");

另外Class类有个方法getSuperClass(),这个方法可以获得代表一个类的父类的的Class对象。Java中8种基本类型的包装类,Integer,Double……,这些包装类有个TYPE属性,也是Class类型,Integer.TYPE和Integer.class不同,通过java的src可知

Integer.TYPE返回的是(Class<Integer>) Class.getPrimitiveClass("int");

 

在获得的Class对象之后就可以利用Class的各种方法获得属性,方法或者实例化一个对象。

 

获得属性:

getFields()     //获取public型属性的数组
getField(String name)   //获取指定名字的属性,但是该属性必须为public类型,否则获取不到
getDeclaredFields()    //获取所有级别访问权限的属性的数组,不仅仅是public了
getDeclaredField(String name)    //同样,获取指定名字的属性,也不再限定为public了

 

获得方法

getMethods()
getMethod(String name, Class<?>... parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name, Class<?>... parameterTypes)

 

和获得属性是一样的,就不多介绍了,其中Class<?>... parameterTypes指的是方法的参数类型,不传值表示没有参数,有参数就按照顺序一个一个填上。需要指出的这里不包括构造方法。

 

构造方法有其专门获取构造方法的函数

getConstructors()
getConstructor(Class<?>... parameterTypes)
getDeclaredConstructors()
getDeclaredConstructor(Class<?>... parameterTypes)

 

和普通方法的获取类似

 

在获得属性或者方法之后就可以进一步获得属性值,或者调用方法

对于属性可以用Field类的

get(Object obj)     返回参数对象上此 Field 表示的字段的值。

对于方法可以用Method类的

invoke(Object obj, Object... args)    对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

 

而对于构造方法不像普通方法那样有invoke方法,这里使用Constructor类newInstance(Object... initargs)

 

这些算是在使用反射机制最常用的的一些东西了吧。

 

还有Class类的方法newInstance()方法用来创建一个对象,以及getName,getSimpleName,getSigners,getPackage等方法,在Java API中都有介绍,需要的时候可以查阅API,这里不做举例介绍

 

当然Field,Method中也有很多实用的方法,有待深入学习

 

分享到:
评论

相关推荐

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

    JAVA反射机制学习

    在"JAVA反射机制学习"资料中,你将深入理解这一关键概念。 首先,我们要明白什么是反射。在Java中,反射是一种在运行时分析类、接口、字段和方法的能力。通过使用`java.lang.Class`对象,我们可以获取任何类的信息...

    java反射机制学习

    Java反射机制是Java编程语言中的一种强大功能,它允许程序在运行时检查和操作类、接口、字段和方法的信息,即使在编译时这些信息是未知的。这一特性使得Java在某种程度上具备了动态语言的特性,尽管Java本身是一种...

    java反射机制学习(五):工厂模式

    在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式结合,提升代码的灵活性和可扩展性。 首先,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式...

    Java反射机制学习总结

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...

    java反射机制学习笔记+反射机制实操案例

    总结来说,Java反射机制是Java语言的一个重要特性,它使得程序能够在运行时动态地获取类的信息并进行操作,提高了代码的通用性和适应性。在实际开发中,反射机制常用于框架设计、插件系统、数据持久化等领域,但同时...

    java反射机制学习笔记

    Java反射机制是Java编程语言的一项重要特性,它允许程序在运行时动态地获取类的信息,并且能够对类的属性和方法进行操作。反射机制的核心在于Java的`java.lang.reflect`包,其中包含了`Class`、`Constructor`、`...

    java反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性以及处理数组等。在本篇讲解中,我们将深入理解如何通过反射来执行方法、操作属性以及处理...

    Java反射机制学习总结.doc

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这种能力使得Java具备了高度的灵活性和动态性,尤其是在处理未知类或者需要在运行时决定行为的情况下。以下...

    java面试题--反射机制

    通过本文的学习,我们深入了解了Java反射机制的基本概念、原理以及应用。Java反射机制为Java程序提供了一种强大的动态处理能力,使得Java不仅仅局限于静态类型语言的功能限制。掌握Java反射机制对于开发者来说是非常...

    java反射机制学习(三):通过反射获取实体类的属性、方法、接口和父类信息

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本教程中,我们将深入探讨如何通过反射获取实体类的属性、方法、接口以及父类信息。 首先,让...

    java反射机制学习(二):通过反射获取构造方法并实例化对象

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本篇文章中,我们将深入探讨如何通过反射获取构造方法并实例化对象,这对于理解和使用Java的...

    java反射机制学习(六):动态代理

    Java反射机制是Java语言中一个强大的工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在动态代理部分,我们将探讨如何利用反射机制实现动态代理,这在处理面向切面编程(AOP)或者为已...

    Java反射机制的学习

    Java反射机制是Java编程语言中的一项核心特性,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够在编译后仍然能够灵活地处理类和对象,增强了代码的动态性。在Android应用开发中,反射机制尤其重要...

    Java反射机制的使用和学习方法

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。这一机制对于理解和实现高级框架、动态代理、元数据处理等场景至关重要。以下是对Java反射机制的详细说明:...

    北大青鸟java反射机制

    在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念:在程序运行时,通过Class对象获取类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用方法。...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中...在实践中学习,你会更好地理解Java反射机制的威力和应用场景。

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,...通过学习和实践Java反射机制,你可以更深入地理解Java的运行机制,并在需要动态性、灵活性的场景中发挥其强大的功能。不过,使用反射时也应注意潜在的风险和性能影响。

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

Global site tag (gtag.js) - Google Analytics