`

java 反射Reflect

阅读更多

public class ReflectDemo {

	public static void main(String[] args) throws ClassNotFoundException,
			SecurityException, IllegalArgumentException, NoSuchMethodException,
			IllegalAccessException, InvocationTargetException,
			InstantiationException, NoSuchFieldException {
		Class claz = Class.forName("com.yss.test.reflect.Demo");// 载入指定的类 or
		// Demo.class;
		/**
		 * 获取该类及继承类中的方法
		 */
		Method[] methods = claz.getMethods();// 包括继承而来的所有的public方法名
		for (int index = 0; index < methods.length; index++) {
			// 获取该方法的名字
			System.out.println(methods[index].getName());
			// 获取该方法的所有参数类型
			Class[] pvec = methods[index].getParameterTypes();
			for (int i = 0; i < pvec.length; i++) {
				System.out.println(pvec[i]);
			}
			// 获取该方法的所有异常类型
			Class[] exce = methods[index].getExceptionTypes();
			// 该方法的返回值类型
			System.out.println(methods[index].getReturnType());
			// 判断该方法定义在那个类中
			System.out.println(methods[index].getDeclaringClass());
		}

		Field[] fields = claz.getFields();// 包括继承而来的所有public方法名
		for (int index = 0; index < fields.length; index++) {
			System.out.println(fields[index].getType() + " "
					+ fields[index].getName());
		}

		System.out.println("-------------------------");
		/**
		 * 获取当前类中的属性和方法
		 */
		Method[] methodss = claz.getDeclaredMethods();// 只在该类中定义的(不包含继承而来的)共有\
		// 私有的方法名
		for (int index = 0; index < methodss.length; index++) {
			System.out.println(methodss[index].getName());
		}
		Field[] fieldss = claz.getDeclaredFields();// 只有该类下定义的(不包含继承来的)共有、私有的属性名
		for (int index = 0; index < fieldss.length; index++) {
			System.out.println(fieldss[index].getType() + " "
					+ fieldss[index].getName());
			/**
			 * 用来描述字段成员的修饰语,如“private int”。这些修饰语自身由整数描述,而且使用 Modifier.toString
			 * 来返回以“官方”顺序排列的字符串描述 (如“static”在“final”之前)。这个程序的输出是:
			 */
			System.out
					.println(Modifier.toString(fieldss[index].getModifiers()));
		}
		/**
		 * 判断new的对象是否是claz的实例
		 */
		boolean ifflag = claz.isInstance(new Demo());
		boolean ifflags = claz.isInstance(new SDemo());
		System.out.println(ifflag + " " + ifflags);// true 和 false

		/**
		 * 获取当前方法的构造函数
		 */
		Constructor[] cons = claz.getDeclaredConstructors();
		for (int con = 0; con < cons.length; con++) {
			System.out.println("获取构造方法: " + cons[con].getName());
		}
		test_method_invoke(claz);

		invoke_constructor(claz);

		change_fields(claz);

		create_array();
		
		create_complex_arr();
	}

	/**
	 * @param claz
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws InstantiationException
	 * 
	 *             利用反射 根据方法的名称来执行方法
	 */
	public static void test_method_invoke(Class claz) throws SecurityException,
			NoSuchMethodException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException,
			InstantiationException {
		Class[] params = new Class[2];// 设置参数类型
		params[0] = int.class;
		params[1] = Integer.TYPE;

		Object demo = claz.newInstance();
		Object[] cp = new Object[2];// 具体参数
		cp[0] = new Integer(11);
		cp[1] = new Integer(3);

		Method params_method = claz.getMethod("share", params);// 获取有参share方法
		Method no_params_method = claz.getMethod("share");// 获取无参share方法

		Object obj = params_method.invoke(demo, cp);
		no_params_method.invoke(demo);

		Integer intg = (Integer) obj;
		System.out.println("返回值: " + intg.intValue());
	}

	/**
	 * 调用constructor的实例
	 * 
	 * @param claz
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 */
	public static void invoke_constructor(Class claz)
			throws InstantiationException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException,
			SecurityException, NoSuchMethodException {
		Class[] params = new Class[4];// 设置参数类型
		params[0] = int.class;
		params[1] = Long.TYPE;
		params[2] = String.class;
		params[3] = Double.TYPE;

		Object demo = claz.newInstance();
		Object[] cp = new Object[4];// 具体参数
		cp[0] = new Integer(11);
		cp[1] = new Long(20);
		cp[2] = new String("青龙");
		cp[3] = new Double(29);

		Constructor constructors = claz.getConstructor(params);// 获取有参构造方法

		Object obj = constructors.newInstance(cp);
	}

	public static void change_fields(Class claz) throws SecurityException,
			NoSuchFieldException, InstantiationException,
			IllegalAccessException {
		Field field = claz.getField("sname");
		Object obj = claz.newInstance();
		System.out.println("设置前:" + ((Demo) obj).getSname());
		field.set(obj, "qinglong");
		System.out.println("设置后:" + ((Demo) obj).getSname());
	}

	/**
	 * 数组在 Java 语言中是一种特殊的类类型,一个数组的引用可以赋给 Object 引用
	 * 
	 * 创建了 n个单位长度的 String 数组,为第 n个位置的字符串赋了值
	 * 
	 * @throws ClassNotFoundException
	 */
	public static void create_array() throws ClassNotFoundException {
		Class claz = Class.forName("java.lang.String");
		Object objarr = Array.newInstance(claz, 4);
		Array.set(objarr, 2, "qing");
		System.out.println("创建数组:" + Array.get(objarr, 2));
	}

	/**
	 * 创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为
	 * 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15
	 * 的数组。进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
	 * 注意创建数组时的类型是动态的,在编译时并不知道其类型。
	 */
	public static void create_complex_arr() {
		int dims[] = new int[] { 5, 10, 15 };
		System.out.println(dims[2]);
		Object arr = Array.newInstance(Integer.TYPE, dims);
		Object arrobj = Array.get(arr, 3);
		Class cls = arrobj.getClass().getComponentType();
		System.out.println(cls);
		arrobj = Array.get(arrobj, 5);
		Array.setInt(arrobj, 10, 37);
		int arrcast[][][] = (int[][][]) arr;
		System.out.println(arrcast[3][5][10]);

	}
}

class SDemo {
	private String aa;
	public int bb;
	public String sname;

	public SDemo() {
		// System.out.println("父类的构造方法");
	}

	public SDemo(String aa, int bb, String sname) {
		this.aa = aa;
		this.bb = bb;
		this.sname = sname;
	}

	public void share() {
		System.out.println("父类中的方法无参数");
	}

	public void share(int a, int b, int c) {
		System.out.println("父类中的方法有参数");
	}

	public String getAa() {
		return aa;
	}

	public void setAa(String aa) {
		this.aa = aa;
	}

	public int getBb() {
		return bb;
	}

	public void setBb(int bb) {
		this.bb = bb;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

}

class Demo extends SDemo {

	public String name;
	private int age;
	private double score;
	private long card;

	public Demo(int age, long card, String name, double score) {
		System.out.println("子类有参构造方法。。。。。");
		this.age = age;
		this.card = card;
		this.name = name;
		this.score = score;
	}

	public Demo() {
		// System.out.println("子类构造方法");
	}

	public void share() {
		System.out.println("子类中的方法无参数");
	}

	public int share(int a, int b) {
		System.out.println("子类中的方法有参数");
		return a + b;
	}

	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 double getScore() {
		return score;
	}

	public void setScore(double score) {
		this.score = score;
	}

	public long getCard() {
		return card;
	}

	public void setCard(long card) {
		this.card = card;
	}
}

参照链接:http://www.iteye.com/topic/602805
分享到:
评论

相关推荐

    9.3 Java反射reflect

    9.3 Java反射reflect

    java反射(reflect)

    java反射(reflect)

    java反射JAVA REFLECT (java 反射)

    JAVA REFLECT (java 反射) 取得类的继承结构 - 类所在的包; |- public Package getPackage() - 类的声明方式; |-取得全类名:public String getName() |-只取类名: public String getSimpleName() - 类所继承...

    java中的反射reflect

    本文章的原代码. 博文链接:https://yidwo.iteye.com/blog/42995

    java r反射源代码

    java 反射 reflect 源代码,包括,内部类,类,方法等三种实现。可直接运行

    Java中的reflect 反射的基本东西,

    JAVA反射的基础,基础,但也有价值,可以看看了解, 通过反射可以是程序的扩展性增强!

    java反射详解例子

    java反射详解,详细说明java反射内部机制,适合初学者。

    Java反射机制.txt

    ava反射机制 概述:通俗地讲Java反射就是通过类名获得类的实例的方法。java.lang.reflect提供了实现Java反射的API。

    java 反射例子 代码

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

    java反射调用封装接口

    万能的反射封装接口,值得下载参考,当成util

    java反射机制核心代码

    java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);

    Java方法反射调用demo

    Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法

    java反射调用实例代码

    该资源包含了一个利用反射执行的一些操作,包含了动态执行构造方法,动态运行私有方法,为属性初始化等等,简单易懂。

    Java reflect 机制详解

    免费共享,很详细的介绍了反射机制的原理,适合追根究底的java学习者

    java reflect

    java反射的一些总结知识点,这是java中反射比较好入门的资料

    JavaReflect

    java反射技术,DaoFactory,通过反射获取接口对象,然后使用接口中的方法。

    Java反射及动态代理

    详细讲解java的reflect包的,阐述反射机制及动态代理的细节问题。其中动态代理部分内容参考网上资料。读完此文,相信会对javaf反射机制有一个完整清楚的了解。尤其应该看看其他中代码举例部分。

    Java 反射机制 代码的实例

    Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了

    java反射简单例子demo

    java reflect Method getDeclaredMethod invoke getConstructor

Global site tag (gtag.js) - Google Analytics