反射详解 II

原创 2014年01月06日 18:57:23

一、反射获取成员字段

<1>Filed类:代表了类中的一个成员变量

   1、得到一个类中的所有成员变量:

   (1)所有公共成员(public)变量:getFields();

   (2)所有声明过(任意权限)的成员变量:getDeclaredFields();

   (3)获取指定的public成员变量:getField(Stringname)

   (4)获取指定的任意权限的成员变量:getDeclaredField(Stringname)

获取成员变量的实体类对象:

public class Student {
	public String name;
	private int age;
	int height;
	protected String sex;
}

【1】   Class类的getFields()方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Field[] fields = clazz.getFields();
		for (Field f : fields) {
			System.out.println(f);
		}

输出结果:public java.lang.String com.jtt.demo.Student.name

只获取公共成员变量

【2】getDeclaredFields()方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Field[] fields = clazz.getDeclaredFields();
		for (Field f : fields) {
			System.out.println(f);
		}

输出结果:

public java.lang.Stringcom.jtt.demo.Student.name

private intcom.jtt.demo.Student.age

int com.jtt.demo.Student.height

protected java.lang.Stringcom.jtt.demo.Student.sex

输出了所有申明成员变量

<2>调用Field类对象的set/get方法来操作对应的字段

其中需要注意的是操作不同权限成员变量,尤其是private

其中:

Class clazz = Class.forName("com.jtt.demo.Student");
		Field field = clazz.getField("age");// age不是public
		Object obj = clazz.newInstance();// 实例化
		field.set(obj, 25);
		System.out.println(field.get(obj));

输出结果:java.lang.NoSuchFieldException: age

原因:age为private类型字段,而getField只能获取public类型字段,故没有获取到这个字段,

这时候我们自然而然的会想起用getDeclaredField()方法

但是还是会报错,不过跟之前的不同

输出结果:java.lang.IllegalAccessException:

Class com.jtt.jdk5.ClassDemo can not access amember of class com.jtt.demo.Student with modifiers "private"

原因:因为age为private类型字段,不能直接操作

解决方法:使用getDeclaredField( )+ 取消对反射对象进行访问权限检查机制操作非public字段

Class clazz = Class.forName("com.jtt.demo.Student");
       Field field = clazz.getDeclaredField("age");// age不是public,用getDeclaredField可获取
       // 取消对反射对象进行访问权限检查机制
       field.setAccessible(true);
       Object obj = clazz.newInstance();// 实例化
       field.set(obj, 25);
       System.out.println(field.get(obj));
输出结果: 25
二、放射获取成员方法

跟获取成员变量方法类似

<1> Method:代表了类中的一个成员方法

   1、得到一个类中的所有成员方法

   (1)所有公共成员(public)方法:getMethods();

   (2)所有声明过(任意权限)的成员方法:getDeclaredMethods();

  (3)获取指定的public成员方法

    getMethod(Stringname,Class<?>…parameterTypes)

  (4)获取指定的任意权限的成员方法:

    getDeclaredMethod(String name,Class<?>…)

获取成员方法的实体类对象:
public class Student {
	private int age;
	private String name;

	public void method() {
		System.out.println("method run...");
	}

	private void method2() {
		System.out.println("method2 run...");
	}
public void paramMethod(String name, int age) {
		System.out.println(name + "paramMethod run..." + age);
	}
 【1】    Class类getMethods()方法
Class clazz = Class.forName("com.jtt.demo.Student");
		Method[] methods = clazz.getMethods();
		for (Method method : methods) {
			System.out.println(method);
		}

输出结果:

public void com.jtt.demo.Student.paramMethod(java.lang.String,int)

public void com.jtt.demo.Student.method()

public final native java.lang.Class java.lang.Object.getClass()

public native int java.lang.Object.hashCode()

public boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public final native void java.lang.Object.notify()

public final native void java.lang.Object.notifyAll()

public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException

public final void java.lang.Object.wait() throws java.lang.InterruptedException

public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException

只获取公共的成员方法,【注意】也包含父类public方法

2getDeclaredFields()方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Field[] fields = clazz.getDeclaredFields();
		for (Field f : fields) {
			System.out.println(f);
		}

输出结果:

private void com.jtt.demo.Student.method2()

public void com.jtt.demo.Student.paramMethod(java.lang.String,int)

public void com.jtt.demo.Student.method()

输出了所有申明的成员方法;【注意】不包含父类的方法,仅仅包含子类任意访问权限的方法

<2>调用Method类对象的invoke方法来调用指定的方法

其中需要注意的是操作不同权限成员方法

[1]. 操作公有public字段类对象

1反射调用无参方法

 Class clazz = Class.forName("com.jtt.demo.Student");
		Object obj = clazz.newInstance();
		Method method = clazz.getMethod("method", null);
   		method.invoke(obj, null);

2反射调用有参方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Object obj = clazz.newInstance();

		Method method = clazz.getMethod("paramMethod", String.class, int.class);
		method.invoke(obj, "lisi", 25);

[2]. 操作公有public字段类对象

其中:

Class clazz = Class.forName("com.jtt.demo.Student");
		Object obj = clazz.newInstance();

		Method method = clazz.getMethod("method2",null);
		method.invoke(obj, null);

输出结果:

java.lang.NoSuchMethodException: com.jtt.demo.Student.Method2()

原因:Method2()private类型方法,而getMethod只能获取public类型字段,故没有获取到这个方法,

这时候我们自然而然的会想起用getDeclaredMethod()方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Object obj = clazz.newInstance();

		Method method = clazz.getDeclaredMethod("method2", null);
		method.invoke(obj, null);

但是还是会报错,不过跟之前的不同

输出结果: java.lang.IllegalAccessException

Class com.jtt.jdk5.ClassDemo can not access a member of class com.jtt.demo.Student with modifiers "private"

原因:因为method2private类型方法,不能直接操作


解决方法:使用getDeclaredMethod( )+ 取消对反射对象进行访问权限检查机制 操作非public方法

Class clazz = Class.forName("com.jtt.demo.Student");
		Object obj = clazz.newInstance();

		Method method = clazz.getDeclaredMethod("method2", null);
		// 指示JVM取消对访问权限的检查
		method.setAccessible(true);
		method.invoke(obj, null);

输出结果method2 run...


C# 反射详解

  • xunzaosiyecao
  • xunzaosiyecao
  • 2016年02月28日 10:04
  • 6730

java 反射详解通俗易懂

Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。  那么什么是Java的反射呢?        大家都知道,要...
  • MissWwg
  • MissWwg
  • 2016年06月13日 18:33
  • 19508

Java反射的用法详解

Java反射详解,如何通过反射获取类的私有属性,如何通过反射调用类的私有方法?...
  • u012481172
  • u012481172
  • 2015年12月03日 14:20
  • 913

java反射详解---反射的理论知识

此篇主要讲解下反射的理论概念,另外一篇则是有很多的实际反射的例子,链接如下: 不要看着多,但是功能就是下面描述的反射的作用 一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允...
  • qq_27093465
  • qq_27093465
  • 2016年08月20日 00:21
  • 837

Java反射机制(源码反射优势解析)

Java反射机制 一、什么是反射机制          简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,      那么就可以通过反射机制来获得...
  • changlei_shennan
  • changlei_shennan
  • 2017年03月08日 11:16
  • 1119

【框架基础】:Java反射机制详解(一)

在学习框架设计之前,先来了解一下框架基础——Java反射机制。         一、什么是反射机制         反射机制是在程序运行状态时,对于任意一个类,都能够知道这个类的所有属性和方法;对...
  • erlian1992
  • erlian1992
  • 2016年11月29日 15:13
  • 1463

反射详解 I

------- android培训、java培训、期待与您交流! ---------- ------- android培训、java培训、期待与您交流! ----------详细请查看:http...
  • xssjtt
  • xssjtt
  • 2014年01月06日 14:47
  • 338

Nios II 11.0/11.1头文件设置

真是一个让人崩溃的一天,今天一下午什么也没干
  • u011762993
  • u011762993
  • 2014年09月26日 20:33
  • 1296

足部反射区点单详解

足外侧反射区图         足背部反射区图         足底部反射区图   ...
  • q123456789098
  • q123456789098
  • 2016年05月18日 09:54
  • 1329

java 反射——使用详解

网上对于java反射的解释已经很多了,很多官方的语言我们并不能很好的理解。我在这里说的通俗些,java反射的作用就是让我们从java虚拟机里面生成的class来进行反序列化得到这个类的实例。那么它的用...
  • yehui928186846
  • yehui928186846
  • 2016年05月22日 14:08
  • 2647
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反射详解 II
举报原因:
原因补充:

(最多只允许输入30个字)