`

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反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java 反射机制

    java 反射机制深入理解,java 反射机制深入理解,java 反射机制深入理解,

    Java反射机制 Java反射机制

    Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制

    JAVA 反射机制应用

    JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用

    JAVA反射机制的简单理解

    有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:

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

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

    反射实例-JAVA反射机制.doc

    反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...

    JAVA反射机制的入门代码

    代码为JAVA反射的一个DEMO,适合初学者临摹学习,还附有properties的创建方法,比较基础。

    候捷谈Java反射机制

    候捷谈Java反射机制 有助深入理解Java新特性

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

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    Java反射机制课件ppt

    Java反射机制Java反射机制Java反射机制Java反射机制

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    JAVA反射机制应用

    描述JAVA反射机制应用、举例。描述反射机制的具体实现及方法实现。

    Java 反射机制 代码的实例

    Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了

    java反射机制pdf

    对于Java基础的巅峰——反射机制的详细描述,反射的入门学习帮手!

    java反射机制demo

    给同事写的反射机制的用法,非常简单易用,大家一看就懂。也便于初学者对反射机制的理解 资源免费提供大家下载,如有疑问,可以直接咨询我

    Java反射机制的实现_Reflection

    Java反射机制的实现_Reflection,适合学习了解反射机制。

    Java反射机制经典案例

    Java 反射机制、Java 的类反射机制、Java 反射机制的学习、Java 反射Reflection--运行时生成实例 java反射机制的手册文档

Global site tag (gtag.js) - Google Analytics