`

java反射机制 入门 理解

阅读更多

一、java中生成对象的方式,本人所能想到的有以下几种(以 com.knight.Employer为例)

1、使用new方式,这每个javaer都会的

   Employer e=new Employer();

2、使用克隆方式(clone),此方式要求Employer实现cloneable接口

   Employer e2=(Employer)e1.clone();

3、序列化方式,此方式要求Employer实现Serializable接口

   ObjectInputStream objIn=new ObjectInputStream(in);//in为InputStream实例

   Employer e=(Employer)objIn.readObject();

4、反射

  反射可以有很多变体,通常有以下几种

  Class c=Class.forName("com.knight.Employer");

  Employer e= (Employer)c.newInstance();

  或者

  ClassLoader loader=Huma.class.getClassLoader();

  Class c=loader.loadClass("com.knight.Employer");

  Employer e= (Employer)c.newInstance();

  此两种方式都要求Employer有公有无参构造函数。

  还有另外一种通过Constructor进行构造,以下详述

5、直接操作字节码,这种方式需要对class文件及虚拟机机制有深刻理解,不是一般的难

 

二、java反射api简介

以下与Huma类为例

package com.knight.test;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;
public class Huma {
 public String name;
 private int age;
 private void log(){
  System.out.println("log invoke");
 }
 public Huma() {
 
 }
 
 public Huma(String name,int age) {
   this.name=name;
   this.age=age;
 }

 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;
 }
}

 

java中反射机制主要使用以下几个类

Class,Constructor,Field,Method,AccessibleObject

1、Class的用法

Class可以获取关于类中所有方法,属性的信息

    Field[] getFields()//获取Huma中声明的公有属性,包括从父类继承的

    Field[] getDeclaredFields()//获取Huma中声明所有属性(包括私有属性),但不包含任何父类继承的属性

注意有无declared的区别,以下不在罗嗦

 

     Field getField(String name)//获取名称为name的属性

以此类似,Class可以获取其对于的Constructor,Method信息

再举一个方法

     Method getDeclaredMethod(String name, Class<?>... parameterTypes);此方法获取成员函数名字为name,函数的参数类型为Class<?>... parameterTypes的函数,其中parameterTypes为null或者为空数组时,表示该函数没有形参

 

 

 

public Object newInstance() //生成该类的一个对象,需有无参构造函数

public static Class forName(String className)//生成className指定的类的Class实例

2、AccessibleObject

   AccessibleObject是一个接口,Constructor,Field,Method均实现了该接口

  

public void setAccessible(boolean flag);该方法设置可访问性,在类的成员为私有的情况下

设置flat为true将可以通过反射修改成员的值,否则会发生异常

3、Field类

 public Object get(Object o);获取该Field实例对应对象o的Field的值

 public void set(Object obj, Object value)  ;设置该Field对应的对象obj的Field属性的值为value

 

3、Method类

    Class<?>[] getParameterTypes() ;返回该Method的形参类型,按声明顺序

    Class<?> getReturnType()   ;返回该Method的返回类型

    Class<?>[] getExceptionTypes() ;返回该Method声明抛出的异常

    Object invoke(Object obj, Object... args) ;执行该Method,obj是该Method所属对象的一个实例

                                                 //args是一个对象数组,表示该Method参数数组实参 
   其中args为null或者为空数组时,表示该函数没形参,当obj为null时,表示该函数为静态方法

4、Constructor类

    Class<T> getDeclaringClass();返回该Constructor所表示的Class对象

    Class<?>[] getParameterTypes() ;返回该Constructor表示的形参类型数组

    T newInstance(Object... initargs) ;生成该Constructor表示的对象的一个实例,initargs为形参数组
  

三、例子

  //  生成Huma实例(带参数)

    Constructor c=Huma.class.getDeclaredConstructor(new Class[]{String.class,int.class}); 

    Huma huma=c.newInstance(new Object[]{"zhang san",18});

 

 //获取Field,并改变其值

   Field nameField=Huma.class.getField("zhangsan");

   nameField.setsetAccessible(true);//注意name属性私有,所以在这里调用,参数为true  

   nameField.set("lisi");//此时name已经变为lisi了,上一句不调用的的话,此句将抛出异常

 

//获取方法并调用

   Method methodSetName=Huma.class.getMethod("setName",new Class[]{String.class});

   methodSetName.invoke(huma,new Object[]{"wangwu"});//相当于 huma.setName("wangwu");

 

 最后需要注意的地方就是反射生成的类,修饰符应该是public的,否则,在其他地方调用时可能会出现问题

,例如 在一个 com.abc.Test的main方法中调用 Class.forName("com.knight.Huma"),并且Huma的修饰符不是public时,将抛出异常

分享到:
评论

相关推荐

    JAVA反射机制的入门代码

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

    Java SE编程入门教程 java反射机制(共16页).pptx

    Java SE编程入门教程涵盖了许多Java基础知识,其中包括对Java反射机制的讲解。反射是Java中一个强大的功能,它允许程序在运行时动态地获取类的信息并进行操作。这使得Java能够实现一些灵活的功能,如动态加载类、...

    java反射 详解 入门到掌握

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、...通过深入理解和熟练运用Java反射机制,开发者可以编写出更加灵活、可扩展的代码,但同时也需要谨慎处理反射可能带来的性能和安全问题。

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第13章_Java反射机制(共44页).pptx

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象的内部细节。Java反射机制的核心在于`java.lang.Class`类,它代表着程序中的每一个类,提供了访问类信息的...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第13章_Java反射机制(共44页).rar

    学习Java反射机制,你需要理解并掌握这些类的使用,同时要明白,虽然反射提供很大的灵活性,但也带来了性能开销和安全风险,因此在实际开发中应谨慎使用。在自学或教学过程中,第13章的Java反射机制课件会深入讲解...

    java反射机制

    ### Java反射机制详解 #### 引言 Java反射机制,作为Java语言动态特性的核心,赋予了Java在运行时分析和操作类的...总之,Java反射机制是理解Java动态特性的关键,掌握它能够极大地提升开发者解决问题的能力和效率。

    java反射入门

    Java反射机制为开发者提供了强大的能力,可以动态加载类、创建对象、访问私有成员、处理泛型等。然而,反射也可能会降低程序的性能,并且可能导致安全问题,因此在使用时需要谨慎。在理解了这些基本概念后,你可以...

    2020老杜最新Java零基础进阶视频教程-反射机制课件

    【Java反射机制详解】 在Java编程中,反射机制是一个强大的工具,它允许程序在运行时检查自身,并且能够动态地操作类和对象的内部信息。这个特性使得Java代码具有高度的灵活性,能够在不修改源码的情况下,根据需要...

    java 反射入门-属性方法调用实例

    这篇博文将带你入门Java反射,并通过属性和方法的调用来实践这一概念。 首先,理解反射的基础概念。在Java中,`Class`类代表了运行时的类信息。通过`Class`对象,我们可以获取到类的名称、构造器、方法和字段。例如...

    java从入门到精通PPT

    最后,PPT可能还介绍了Java的高级话题,如反射、注解、泛型和设计模式。这些内容有助于提升你的编程技巧,使你能更好地应对复杂项目的需求。 总的来说,“java从入门到精通PPT”提供了一个全面的学习路线,从基础到...

    Java基础入门四泛型反射注解.pdf

    在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...

    JAVA基础入门到精通pdf

    12. **反射**:反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能动态创建对象和调用方法。 13. **注解(Annotation)**:注解是元数据的一种形式,提供了一种安全的方式向编译器和JVM传递信息,用于...

    Java从入门到项目实战【配套资源】自测题目.rar

    7. **反射机制**:Java反射机制允许在运行时动态访问类的信息,如类名、方法名、参数类型等,从而实现动态加载类、调用方法等功能。这对于理解和编写工具类或插件化系统非常有用。 8. **JVM原理**:理解Java虚拟机...

    Java反射基础入门,一篇就够啦

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。 1. 反射的基本...

    Java基础入门.rar

    9. **反射机制**:如何在运行时动态获取类的信息,创建和调用类的对象。 10. **标准库应用**:如使用Math类进行数学计算,日期时间API,网络编程的Socket类等。 通过阅读这些源码并动手实践,学习者不仅能掌握Java...

    《Java从入门到精通(第4版)》随书PPT

    12. **反射与注解**:讲解Java反射机制,如何动态访问和修改类、接口、方法,以及注解的使用和自定义注解的创建。 13. **Java高级特性**:如模块化系统(Project Jigsaw)、Optional类、并发工具类(如...

    java 从入门到精通 源代码

    如异常处理、集合框架(ArrayList、LinkedList、HashMap等)、IO流(用于文件读写和网络通信)、多线程编程(线程同步、线程池)、反射机制、设计模式(如单例模式、工厂模式、观察者模式等)以及Java的高级API,如...

    Java反射入门

    以下是对"Java反射入门"这一主题的详细解释。 1. **什么是反射**: 在Java中,反射是指程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和...

    Java开发从入门到精通 扶松柏,陈小玉编著 2016.09 随书光盘

    7. **Java高级特性**:涵盖反射、动态代理、注解、枚举等Java的高级特性和应用场景。 8. **Java EE**:如果光盘内容涉及,可能会介绍Java企业级应用开发,如Servlet、JSP、JDBC数据库访问、EJB等技术。 9. **实战...

    java技术从入门到精通(孙鑫)学习笔记

    反射机制允许程序在运行时检查和操作类、接口、字段和方法,是实现动态代理、插件化等高级功能的基础。除此之外,Java的泛型、枚举、注解等特性也会被详尽阐述,这些都能提高代码的可读性和复用性。 进一步深入,你...

Global site tag (gtag.js) - Google Analytics