通过反射获取类对象的成员函数、成员变量(只获取成员函数)、构造函数

在反射中有三种方法可以获取类的类类型:

Foo foo1 = new Foo();

1、 Class c1 = Foo.Class;   2、 Class c2 = foo1.getClass();    3、Class c3 = Class.forName();

新建ReflectUtil.java,用于编写通过反射方法获取类的成员函数、成员变量(只获取成员函数)、构造函数

package com.imooc.io;

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

public class ReflectUtil {
	/*
	 * 打印类的信息,包括类的成员函数、成员变量(只获取成员函数)
	 * @param obj 该对象所属类的信息
	 */
	public static void getMessage(Object obj){
		//获取对象的类类型,传递的是哪个子类的对象  c就是该子类的类类型
		Class c = obj.getClass();
		//获取类的名称
		System.out.println("该类的名称是:"+c.getName());
		
		/*
		 * Method类,方法对象
		 * 一个成员方法就是一个Method对象
		 * getMethods()方法获取的是所有的public的函数,包括父类继承而来的
		 * getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
		 */
		Method[] ms = c.getMethods();
		for(int i = 0; i<ms.length; i++){
			//得到方法返回值的类型
			Class returntype = ms[i].getReturnType();
			System.out.print(returntype.getName()+" ");
			//得到方法的名称
			System.out.print(ms[i].getName()+"(");
			//获取方法参数的类类型
			Class[] para = ms[i].getParameterTypes();
			for(Class params : para){
				System.out.print(params.getName()+",");
			}
			System.out.println(")");
		}
	}
	
	/**
	 * 获取类的成员变量
	 * @param Object obj
	 */
	public static void getFieldMessage(Object obj){
		//获取对象的类类型
		Class c = obj.getClass();
		/*
		 * 成员变量也是对象
		 * java.lang.reflect.Field
		 * Field类封装了关于成员变量的操作
		 * getFields()方法获取的是所有的public的成员变量的信息
		 * getDeclaredFields获取的是该类自己声明的成员变量的信息
		 */
		//Field[] fs = c.getFields();
		Field[] filed = c.getDeclaredFields();
		for (Field field1 : filed) {
			//获取成员变量类型的类类型
			Class fieldtype = field1.getType();
			//输出成员变量的类型
			System.out.print(fieldtype.getName()+" ");
			//输出成员变量
			System.out.println(field1.getName());
		}
	}
	
	/**
	 *打印对象的构造函数的信息
	 */
	public static void getConMessage(Object obj){
		Class c = obj.getClass();
		Constructor[] con = c.getDeclaredConstructors();
		for (Constructor constructor1 : con) {
			System.out.print(constructor1.getName()+"(");
			//获取构造函数的参数列表--->得到的是参数列表的类类型
			Class[] param = constructor1.getParameterTypes();
			for (Class class1 : param) {
				System.out.print(class1.getName()+",");
			}
			System.out.print(")");
			System.out.println();
		}
	}
	
}






再新建Reflectest.java用于测试:

package com.imooc.io;

public class Reflectest {
	public static void main(String[] args){
		String s = "hello";
		//获取Sring类的成员方法
		ReflectUtil.getMessage(s);
		System.out.println("######################################");
		//获取String类的成员变量以及类型
		ReflectUtil.getFieldMessage(s);
		System.out.println("######################################");
		//获取String类的构造函数
		ReflectUtil.getConMessage(s);
	}
}



运行结果如下:

该类的名称是:java.lang.String
int hashCode()
boolean equals(java.lang.Object,)
java.lang.String toString()
char charAt(int,)
int codePointAt(int,)
int codePointBefore(int,)
int codePointCount(int,int,)
int compareTo(java.lang.Object,)
int compareTo(java.lang.String,)
int compareToIgnoreCase(java.lang.String,)
java.lang.String concat(java.lang.String,)
boolean contains(java.lang.CharSequence,)
boolean contentEquals(java.lang.StringBuffer,)
boolean contentEquals(java.lang.CharSequence,)
java.lang.String copyValueOf([C,)
java.lang.String copyValueOf([C,int,int,)
boolean endsWith(java.lang.String,)
boolean equalsIgnoreCase(java.lang.String,)
java.lang.String format(java.util.Locale,java.lang.String,[Ljava.lang.Object;,)
java.lang.String format(java.lang.String,[Ljava.lang.Object;,)
[B getBytes(java.nio.charset.Charset,)
void getBytes(int,int,[B,int,)
[B getBytes(java.lang.String,)
[B getBytes()
void getChars(int,int,[C,int,)
int indexOf(int,)
int indexOf(java.lang.String,)
int indexOf(int,int,)
int indexOf(java.lang.String,int,)
java.lang.String intern()
boolean isEmpty()
int lastIndexOf(int,int,)
int lastIndexOf(java.lang.String,int,)
int lastIndexOf(java.lang.String,)
int lastIndexOf(int,)
int length()
boolean matches(java.lang.String,)
int offsetByCodePoints(int,int,)
boolean regionMatches(int,java.lang.String,int,int,)
boolean regionMatches(boolean,int,java.lang.String,int,int,)
java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence,)
java.lang.String replace(char,char,)
java.lang.String replaceAll(java.lang.String,java.lang.String,)
java.lang.String replaceFirst(java.lang.String,java.lang.String,)
[Ljava.lang.String; split(java.lang.String,)
[Ljava.lang.String; split(java.lang.String,int,)
boolean startsWith(java.lang.String,)
boolean startsWith(java.lang.String,int,)
java.lang.CharSequence subSequence(int,int,)
java.lang.String substring(int,)
java.lang.String substring(int,int,)
[C toCharArray()
java.lang.String toLowerCase()
java.lang.String toLowerCase(java.util.Locale,)
java.lang.String toUpperCase()
java.lang.String toUpperCase(java.util.Locale,)
java.lang.String trim()
java.lang.String valueOf(float,)
java.lang.String valueOf(double,)
java.lang.String valueOf(boolean,)
java.lang.String valueOf([C,int,int,)
java.lang.String valueOf([C,)
java.lang.String valueOf(long,)
java.lang.String valueOf(int,)
java.lang.String valueOf(char,)
java.lang.String valueOf(java.lang.Object,)
java.lang.Class getClass()
void notify()
void notifyAll()
void wait(long,int,)
void wait()
void wait(long,)
######################################
[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
int HASHING_SEED
int hash32
######################################
java.lang.String([B,)
java.lang.String([B,int,int,)
java.lang.String([B,java.nio.charset.Charset,)
java.lang.String([B,java.lang.String,)
java.lang.String([B,int,int,java.nio.charset.Charset,)
java.lang.String(int,int,[C,)
java.lang.String([C,boolean,)
java.lang.String(java.lang.StringBuilder,)
java.lang.String(java.lang.StringBuffer,)
java.lang.String([I,int,int,)
java.lang.String([C,int,int,)
java.lang.String([C,)
java.lang.String(java.lang.String,)
java.lang.String()
java.lang.String([B,int,int,java.lang.String,)
java.lang.String([B,int,)
java.lang.String([B,int,int,int,)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值