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();
}
}
}
反射獲取類屬性和方法的調用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.