码迷,mamicode.com
首页 > 其他好文 > 详细

通过反射获取类的类名,方法和内部成员变量

时间:2016-06-26 18:22:19      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

package cn.lonecloud.reflect;

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

import org.junit.Test;

public class ClassUtil {
	/**
	 * 获取该类的信息
	 * 比如他的类的类名和函数
	 * @param obj
	 */
	public static void getClassInfo(Object obj){
		//获取obj的类类型
		Class c1=obj.getClass();
		System.out.println("类的类型为"+c1.getName());
		System.out.println("类的类型为"+c1.getSimpleName());
		//获取类的类方法包括其父类的方法
		Method[] methods=c1.getMethods();
		System.out.println("该类的方法为");
		int c=0;
		for (int i = 0; i < methods.length; i++) {
			c++;
			Class returntype=methods[i].getReturnType();//获取该类的返回值
			System.out.print(returntype.getSimpleName()+" ");//打印返回值
			System.out.print(methods[i].getName()+"(");//打印方法名
			Class[] prams=methods[i].getParameterTypes();//获取参数的方法
			for (int j = 0; j < prams.length; j++) {
				System.out.print(prams[j].getSimpleName()+"  ");//打印参数名
			}
			System.out.println(")");
		}
		System.out.println("利用getDeclaredMethods");
		//获取类的本类方法,不包含父类的方法可以获取他的类里面的所有方法
		Method[] methods1=c1.getDeclaredMethods();
		System.out.println("该类的方法为");
		int count=0;
		for (int i = 0; i < methods1.length; i++) {
			count++;
			Class returntype=methods1[i].getReturnType();//获取该类的返回值
			System.out.print(returntype.getSimpleName()+" ");//打印返回值
			System.out.print(methods1[i].getName()+"(");//打印方法名
			Class[] prams=methods1[i].getParameterTypes();//获取参数的方法
			for (int j = 0; j < prams.length; j++) {
				System.out.print(prams[j].getSimpleName()+"  ");//打印参数名
			}
			System.out.println(")");
		}
		System.out.println(c+"  "+count);
	}
	/**
	 * 获取构造方法
	 * @param obj
	 */
	public void getConMethod(Object obj){
		Class c=obj.getClass();
		//获取类的构造方法
		Constructor[] declaredConstructors = c.getDeclaredConstructors();
		for (Constructor constructor : declaredConstructors) {
			System.out.print(constructor.getName()+"(");
			Class[] parameterTypes = constructor.getParameterTypes();
			for (Class class1 : parameterTypes) {
				System.out.print(class1.getName());
			}
		}
		System.out.println(")");
	}
	public void getClassFields(Object obj) {
		Class c=obj.getClass();
		//获取该类的成员变量
		Field[] declaredFields = c.getDeclaredFields();
		for (Field field : declaredFields) {
			//获取成员变量的类型
			System.out.print(field.getType().getName()+" ");
			//获取成员变量的名称
			System.out.println(field.getName());
		}
	}
	public void runClassMethod(Object obj) throws Exception{
		Class c1=obj.getClass();//获取类类型
		/*
		 * c1.getDeclaredMethod("syso", parameterTypes)
		 * 第一个是方法名,第二个为参数
		 */
		Method m1=c1.getDeclaredMethod("de");
		m1.setAccessible(true);//设置这个方法的权限为public但是不会改变该方法的原有的权限
		/*
		 * invoke(obj)对于指定的方法执行第一参数为这个对象,第二个为函数参数
		 */
		System.out.println(m1.invoke(obj));
	}
	@Test
	public void test() throws Exception{
//		String s="cewc";
//		getClassInfo(s);
		word w=new word();
		getClassInfo(w);
		getConMethod(w);
		getClassFields(w);
		runClassMethod(w);
	}
}

  

通过反射获取类的类名,方法和内部成员变量

标签:

原文地址:http://www.cnblogs.com/lonecloud/p/5618229.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!