Java反射机制(取得类的结构)

通过反射得到一个类中的完整的结构,就要使用java.lang.reflect包中的以下几个类:

Constructor:表示类中的构造方法

Field:表示类中的属性

Method:表示类中的方法

Class类中的常用方法:

确定此对象所表示的类或接口实现的接口。

public Class<?>[] getInterfaces()

取得父类

public Class<? super T> getSuperclass()

取得全部的构造方法

public Constructor<?>[] getConstructors()throws SecurityException

取得类中的全部方法

public Method[] getMethods()throws SecurityException

Method类中的常用方法:

获取全部异常抛出

public Class<?>[] getExceptionTypes()

获取本方法的访问修饰符(取出权限)

public int getModifiers()

获取方法的返回值类型

public Class<?> getReturnType()

获得方法的全部参数类型

public Class<?>[] getParameterTypes()

Constructor<T>类中的常用的方法:

列出构造方法中的参数类型

public Class<?>[] getParameterTypes()

获取本方法的访问修饰符(取出权限)

public int getModifiers()

注:在取得权限时发现返回的是一个数字而不是public,这是因为在整个java中对于方法的修饰符是使用一定的数字表示出来的,如果要把这个数字还原成用户可以看懂的关键字,则必须依靠Modifier类完成;

int modifiers = constructors[i].getModifiers();

//还原权限(public static String toString(int mod))

System. out.println(Modifier.toString(modifiers));

输出构造方法的名称

public String getName()

Field(属性)中的常用的方法:

一般获取属性时有两种操作:

1:得到实现结构的接口或父类中的公共属性:

public Field[] getFields() throws SecurityExceotion

2:得到本类中的全部属性

public Field[] getDeclaredFields() throws SecurityExceotion

常用方法:

取得属性的类型:

public Class<?> getType()

得到修饰符数字

public int getModifiers()

实例:

package cn.itcast;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ClassDemo05 {
	public static void main(String[] args) {
		Class<?> c1 = null;

		try {
			c1 = Class.forName("cn.itcast.Person");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("-----------------获取实现的全部接口----------------");
		// 获取实现的全部接口
		Class<?> interfaces[] = c1.getInterfaces();
		for (Class<?> thisclass : interfaces) {
			System.out.println(thisclass.getName());
		}

		System.out.println("-----------------取得父类----------------");
		Class<?> superclass = c1.getSuperclass();
		System.out.println(superclass.getName());

		System.out.println("-----------------取得一个类中的全部的构造方法----------------");
		Constructor<?> constructors[] = c1.getConstructors();
		for (int i = 0; i < constructors.length; i++) {
			Class<?> parameterTypes[] = constructors[i].getParameterTypes();
			//取得权限
			int modifiers = constructors[i].getModifiers();
			//还原权限(public static String toString(int mod))
			System.out.println(Modifier.toString(modifiers));
			//输出构造方法名称
			String name = constructors[i].getName();
			//循环打印参数类型
			for (int j = 0; j < parameterTypes.length; j++) {
				System.out.println(parameterTypes[j]);
				System.out.println(modifiers);
				System.out.println(name);
			}

		}
		System.out.println("-----------------------取得全部的方法-------------------------");
		//获取全部的方法
		Method[] methods = c1.getMethods();
		for (int j = 0; j < methods.length; j++) {
			System.out.println(methods[j]);
			//得到方法的返回值类型
			Class<?> returnType = methods[j].getReturnType();
			System.out.println(returnType);
			//得到全部参数的类型
			Class<?>[] parameterTypes2 = methods[j].getParameterTypes();
			for (Class<?> class1 : parameterTypes2) {
				System.out.println(class1);
			}
			//获得全部异常抛出
			Class<?>[] exceptionTypes = methods[j].getExceptionTypes();
			//判断是否有异常
			if(exceptionTypes.length>0)
			{
				System.out.println(") throws ");
			}else{
				System.out.println(")");
			}
			for (int i = 0; i < exceptionTypes.length; i++) {
				System.out.println(exceptionTypes[i].getName());
				if(i<exceptionTypes.length-1)
				{
					System.out.println(",");
				}
			}
			System.out.println();
		}
		System.out.println("==================取得本类全部属性==================");
		//得到本类中的属性
		Field[] declaredFields = c1.getDeclaredFields();
		for (int i = 0; i < declaredFields.length; i++) {
			//取得本类中属性类型
			Class<?> type = declaredFields[i].getType();
			System.out.println(type);
			//得到修饰符的数字
			int modifiers = declaredFields[i].getModifiers();
			System.out.println(modifiers);
			//取得属性的修饰符
			String priv = Modifier.toString(modifiers);
			System.out.println(priv);

		}
		System.out.println("==================取得父类全部属性==================");
		Field[] fields = c1.getFields();
		for (int i = 0; i < fields.length; i++) {
			Class<?> type = fields[i].getType();
			System.out.println(type);
			int modifiers = fields[i].getModifiers();
			System.out.println(modifiers);
			String priv = Modifier.toString(modifiers);
			System.out.println(priv);
		}
	}
}

 

Person类:
package cn.itcast02;

public class Person implements China{
	private String name;
	private int age;
	private char sex;

	public Person() {
		super();
	}

	public Person(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

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

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}
	public void eat()
	{
		System.out.println("吃了");
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

	@Override
	public void sayChina() {
		// TODO Auto-generated method stub
		System.out.println("作者:"+ AUTHOR + "国籍:"+ NATIONAL);
	}

	@Override
	public String sayHello(String name, int age, char sex) {
		// TODO Auto-generated method stub
		return "姓名:" + name +"年龄:"+ age +"性别:"+ sex;
	}

}

  

China接口:
package cn.itcast02;

public interface China {
	public static final String NATIONAL = "China";
	public static final String AUTHOR = "成龙";

	public void sayChina();

	public String sayHello(String name, int age, char sex);
}

  

 

时间: 2024-11-04 22:53:47

Java反射机制(取得类的结构)的相关文章

Java 反射机制(包括组成、结构、示例说明等内容)

http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation

Java反射机制Class类的用法详解

本文转自http://blog.sina.com.cn/s/blog_6c9536b90100rqh4.html,感谢作者 java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关java中Class类的相关知识! java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息. 当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象

Java反射机制demo(四)—获取一个类的父类和实现的接口

Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 Object 类.一个接口.一个基本类型或 void,则返回 null.如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象. 测试代码: package com.aaron.reflect; public class Demo4 { public static void

java 反射机制:运行时的类信息(为框架服务的Bug存在)

反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 换一种引出反射的说法是:当通过反射与一个未知的类型的对象打交道是,JVM只是简单地检查这个类,看它是属于哪个特定的类(就想RTTI那样).在用它做其他事情之前必须先加载那个类的Class对象.因此,那个类的.class文件对于JVM来说必须是可获取的:那么在本地机器上,要么通过网络获得

工厂类分离与java反射机制

网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录 加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我 黙言 加博友   关注他 他的网易微博 最新日志 Javascript 操作select控件 Oracle 存储过程基本语法 将域名和tomcat6进行绑定的 svn 423 Locked JS的trim()方法 jbpm4.4 结束流程时报错 随机阅读 让员工每年有一次机会当主角 外国女性如何舍身"套"色狼 亚洲电

Java通过反射机制修改类中的私有属性的值

首先创建一个类包含一个私有属性: class PrivateField{ private String username = "Jason"; } 通过反射机制修改username的值: //创建一个类的对象 PrivateField privateField = new PrivateField(); //获取对象的Class Class<?> classType = privateField.getClass(); //获取指定名字的私有域 Field field =

java反射机制取出model类的所有变量,以及value

原文:java反射机制取出model类的所有变量,以及value 源代码下载地址:http://www.zuidaima.com/share/1550463649270784.htm 工作上遇到个问题,顺便解决了,希望对大家有帮助 package com.zuidaima.util; public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAcce

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用

Java反射机制专题

·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法 ·Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任何一个对象的成员变量和方法 生成动态代理 ·反射相关的主要API: java.lang.Class:代表一个类 java.lang.refle

Java 反射机制(一)

Java 反射机制 基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制. Java反射机制主要提供了以下功能: 1.在运行时判断任意一个对象所属的类. 2.在运行时构造任意一个类的对象. 3.在运行时判断任意一个类所具有的成员变量和方法. 4.在运行时调用任意一个对象的方法. Reflection是Jav