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

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

  

时间: 2024-10-14 04:29:40

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

C#通过反射获取类中的方法和参数个数,反射调用方法带参数

using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args) { //反射获取 命名空间+类名 string className = "ConsoleApp2.ClassSample"; string methodName = "test1"; //传递参数 Object[] paras = new Obje

反射获取类的几种方法

1 public class Demo { 2 3 /** 4 * 反射:加载类,获得类的字节码 5 * @param args 6 * @throws ClassNotFoundException 7 */ 8 public static void main(String[] args) throws ClassNotFoundException { 9 10 //1 11 Class clazz = Class.forName("Person"); 12 13 //2 14 Cla

Java反射获取类和对象信息全解析

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.forName(String clazzName)静态方法 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用) 调用某个对象的getClass()方法 具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的

java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; import java.io.Serializable; public class Creature<T> implements Serializable { private char gender; public double weight; private void breath() { Syste

第六课 JAVA反射获取对象属性和方法(通过配置文件)

Service1.java package reflection; public class Service1 { public void doService1(){ System.out.println("业务方法1"); } } Service2.java package reflection; public class Service2 { public void doService2(){ System.out.println("业务方法1"); } } s

通过反射 调用 类里面的 方法的方法

通过反射 调用 类里面的 方法的方法(注意 重载 ,可以 按F12转到 定义 查看 ): 错误方法: MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType); dynMethod.Invoke(this, new object[] { methodParams }); 正确 方法 : MethodInfo dynMethod = this.GetType().GetMethod("Draw_&qu

JAVA类与对象(四)----成员变量与局部变量 、成员方法、构造方法

类体中的变量分为两部分.变量定义部分定义的变量为类的成员变量,在方法体中定义的变量和方法中涉及的变量称为局部变量. 成员变量和局部变量的区别: (1).成员变量在整个类中都有效,局部变量只在定义它的方法中有效 (2).成员变量分为实例成员变量(简称实例变量)和类变量(简称静态变量),如果在成员变量类型前加static,这个变量就称为类变量. (3).如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏 ,也就是说,这个成员变量在这个方法中暂时失效. 例: public class Benso

类内const static(static const)成员变量初始化问题

在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许const static成员变量在类外初始化,这个应该是编译器遗留下的bug(你也可以说是要求严格). 在其他编译器下,整型以及枚举类型的const static成员变量是允许在声明的同时进行初始的,其中整型包括int.short.long.char等,非整型是指浮点型 包括float.double等.

C# 使用反射获取类的成员变量名、方法及属性的若干笔记

参考链接:http://blog.csdn.net/ccaakkee/article/details/2425950,作者:CSDN ccaakkee   http://blog.csdn.net/jaydawson/article/details/5539438,作者:CSDN jaydawson 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys