類對象概念: 所有的類,都存在一個類對象,這個類對象用於提供類本身的信息,比如有幾種構造方法, 有多少屬性,有哪些普通方法。
一.獲取類對象有3種方式
1. Class.forName
2. Hero.class
3. new Hero().getClass()
在一個JVM中,一種類,只會有一個類對象存在。所以以上三種方式取出來的類對象,都是一樣的。
@Test
public void TestReflection() throws Exception {
Class<UserServiceImpl> userServiceClass = UserServiceImpl.class;
Class pClass1=Class.forName("com.piscn.postgre.service.impl.UserServiceImpl"); //方法1
Class pClass2=UserServiceImpl.class;//方法2
UserServiceImpl userService = new UserServiceImpl();
Class pClass3=userService.getClass(); //方法3
Method testaa = pClass3.getMethod("testaa"); //可以取得裏面的方法
System.out.println("isSynthetic"+testaa.isSynthetic());
Method[] methods = pClass2.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("TestReflection:"+methods[i].getName()); //打印出所有方法的名字
}
}
更多java好文請參照:
二.創建對象
與傳統的通過new 來獲取對象的方式不同
反射機制,會先拿到***的“類對象”,然後通過類對象獲取“構造器對象”
再通過構造器對象創建一個對象
@Test
public void TestReflection2() throws Exception {
Class<?> userBeanClass = Class.forName("com.piscn.postgre.bean.UserBean");
//構造器
Constructor constructor = userBeanClass.getConstructor();
//通過構造器實例化對象
UserBean userBean = (UserBean)constructor.newInstance();
userBean.setName("2222");
System.out.println(userBean.getClass().getName()); //取得class 名字
System.out.println(userBean.getName());
}
運行結果:
com.piscn.postgre.bean.UserBean
2222
更多java好文請參照:
三.通過反射機制修改對象的屬性,
通過反射機制操作方法
// 只有public 屬性的屬性能變得到
Field nameFiled = userBean.getClass().getField("name");
nameFiled.set(userBean,"55555555");
@Test
public void TestReflection3() throws Exception {
Class<?> userBeanClass = Class.forName("com.piscn.postgre.bean.UserBean");
//構造器
Constructor constructor = userBeanClass.getConstructor();
//通過構造器實例化對象
UserBean userBean = (UserBean)constructor.newInstance();
userBean.setName("2222");
Field[] fields = userBean.getClass().getFields();
for (Field field : fields) { // 屬性是public的才能獲取到
System.out.println("fields is length:"+fields.length);
System.out.println(field.getName());
}
// 調用屬性
Field nameFiled = userBean.getClass().getField("name");
nameFiled.set(userBean,"Filed set name");
System.out.println(userBean.getName());
// 調用方法
Method declaredMethod = userBeanClass.getDeclaredMethod("setRemark", String.class);// String.class是參數的屬性
declaredMethod.invoke(userBean, "method set name"); //利用方法進行操作
System.out.println(userBean.getRemark());
}
更多java好文請參照: