反射獲取類屬性和方法的調用

package io.stream;

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

public class ReflectTest {
	public static void main(String[] args) {
		// test1();
		// test2();
		// test3();
		// test4();
		// test5();
		// test6();
		test7();
	}

	private static void test7() {
		// 得到並調用指定的方法(帶參數)
		Class<?> cl;
		try {
			cl = Class.forName("io.stream.Student");
			Object obj = cl.newInstance();
			Class<?>[] paras={String.class,int.class}; 
			Method me=cl.getDeclaredMethod("sayHello", paras);//得到方法
			Object[] val={"dd",2};//把參數存進數組,參數數組爲Object類型
			Object objval = me.invoke(obj, val);//執行帶參數的方法
			System.out.println(objval);//輸出返回值
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void test6() {
		// 得到並調用指定的方法
		try {
			Class<?> cl = Class.forName("io.stream.Student");
			Object obj = cl.newInstance();
			Method me = cl.getMethod("sayHi", null);// 得到方法
			Object objval = me.invoke(obj, null);// 執行方法,普通方法執行用invoke
			System.out.println(objval);// 得到執行方法的返回值
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void test5() {
		// 得到所有的方法
		try {
			Class<?> cl = Class.forName("io.stream.Student");
			Method[] me = cl.getDeclaredMethods();
			for (Method m : me) {
				System.out.println(m.getName() + "\t" + m.getTypeParameters()
						+ "\t" + m.getReturnType().getName() + "\t"
						+ Modifier.toString(m.getModifiers()));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void test4() {
		// 得到並調用帶參的構造方法
		try {
			Class<?> cl = Class.forName("io.stream.Student");
			Constructor<?> c = cl.getDeclaredConstructor(String.class,
					String.class, int.class);//得到構造方法
			Object obj = c.newInstance("01", "王安石", 40);//構造方法執行用newInstance方法
			// System.out.println("ff");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void test3() {
		// 得到並調用無參構造方法
		try {
			Class<?> cl = Class.forName("io.stream.Student");
			Constructor<?>[] con = cl.getDeclaredConstructors();
			System.out.println(con.length);
			Constructor<?> c = cl.getDeclaredConstructor(null);// 得到無參構造方法
			Object obj = c.newInstance(null);// 新建一個實例
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void test2() {
		// TODO Auto-generated method stub
		Class cl;
		try {
			cl = Class.forName("io.stream.Student");
			Object obj = cl.newInstance();
			Field f = cl.getDeclaredField("stuName");
			f.setAccessible(true);//設置私有的可以訪問
			f.set(obj, "李商隱");
			System.out.println(f.get(obj));

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static void test1() {
		// TODO Auto-generated method stub
		try {
			Class<?> cl = Class.forName("io.stream.Student");
			// Object obj=cl.getInterfaces();
			Field[] fl = cl.getDeclaredFields();//得到屬性(字段)
			for (Field f : fl) {
				System.out.println(f.getName() + "\t" + f.getType() + "\t"
						+ f.getModifiers() + "\t"
						+ Modifier.toString(f.getModifiers()));
			}
			Field f = cl.getDeclaredField("stuid");
			System.out.println(f.getName() + "\t" + f.getType() + "\t"
					+ f.getModifiers() + "\t"
					+ Modifier.toString(f.getModifiers()));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章