java 反射 框架_Java 反射,开发框架必备技能
通過反射技術(shù)我們將上面的統(tǒng)一資源定位付(URL) 映射到Class 相當(dāng)于
class: news
method: list
parameter: 2
差不多就是下面樣子
class News{
public String list(String catagory_id){
...
...
}
}
我們只需要在框架核心中分析 url 然后調(diào)用對(duì)應(yīng)的方法,于此同時(shí)將參數(shù)傳遞過去。
Class>?cls?=?Class.forName("cn.netkiller.reflect.News");
Object?obj=?cls.newInstance();
Method?method?=?cls.getDeclaredMethod("list",?int.class);
return?method.invoke(obj,?2);
1.9.?Reflection 反射this.getClass().getName()?//當(dāng)前Class名字
Thread.currentThread().getStackTrace()[1].getMethodName());?//當(dāng)前方法名
1.9.1.?獲得所有變量Field[]?fields?=?objClass.getFields();
for?(Field?field?:?fields)?{
System.out.println(field.getName());
}
注意:只能去除 public變量
1.9.2.?批量賦值
1.9.3.?方法操作下載
JAVA反射調(diào)用方法的步驟有三步得到要調(diào)用類的class
得到要調(diào)用的類中的方法(Method)
方法調(diào)用(invoke)
1.9.3.1.?獲得所有方法Class>?objClass?=?a.getClass();
Method[]?methods?=??objClass.getDeclaredMethods();
for?(Method?method?:?methods)?{
System.out.println(method);
}
1.9.3.2.?set/get 方法下載package?cn.netkiller.reflect;
import?java.lang.reflect.InvocationTargetException;
import?java.lang.reflect.Method;
public?class?Member?{
public?String?name;
private?int?age;
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;
}
@Override
public?String?toString()?{
return?"ClassA?[name="?+?name?+?",?age="?+?age?+?"]";
}
public?Member()?{
//?TODO?Auto-generated?constructor?stub
}
public?static?void?main(String[]?args)?throws?ClassNotFoundException,?InstantiationException,?IllegalAccessException,?NoSuchMethodException,?SecurityException,?IllegalArgumentException,?InvocationTargetException?{
Class>?cls?=?Class.forName("cn.netkiller.reflect.Member");
Object?member?=?cls.newInstance();
Method?setMethod?=?cls.getDeclaredMethod("setAge",?int.class);
setMethod.invoke(member,?15);
Method?getMethod?=?cls.getDeclaredMethod("getAge");
System.out.println(getMethod.invoke(member));
}
}
下面做一個(gè)稍微復(fù)雜點(diǎn)的例子,ClassB繼承ClassA,取出ClassA的成員變量賦值到ClassA。下載package?cn.netkiller.reflect;
public?class?ClassA?{
public?String?name;
private?int?age;
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?ClassA()?{
//?TODO?Auto-generated?constructor?stub
}
@Override
public?String?toString()?{
return?"ClassA?[name="?+?name?+?",?age="?+?age?+?"]";
}
}
package?cn.netkiller.reflect;
public?class?ClassB?extends?ClassA{
public?ClassB()?{
//?TODO?Auto-generated?constructor?stub
}
private?String?address;
public?String?getAddress()?{
return?address;
}
public?void?setAddress(String?address)?{
this.address?=?address;
}
@Override
public?String?toString()?{
return?"ClassB?[address="?+?address?+?"]";
}
}
package?cn.netkiller.reflect;
import?java.lang.reflect.Field;
import?java.lang.reflect.InvocationTargetException;
import?java.lang.reflect.Method;
public?class?ReflectionTest?{
public?ReflectionTest()?{
//?TODO?Auto-generated?constructor?stub
}
下載
public?void?testSetMethod()?throws?NoSuchMethodException,?SecurityException,?IllegalAccessException,?IllegalArgumentException,?InvocationTargetException,?InstantiationException?{
//?ClassA?a?=?new?ClassA();
ClassB?b?=?new?ClassB();
b.setAddress("Shenzhen");
Class?classA?=?ClassA.class;
ClassA?a?=?classA.newInstance();
a.setName("Neo");
a.setAge(30);
System.out.println(classA.getDeclaredMethod("getAge").invoke(a));
Method?m?=?classA.getDeclaredMethod("setAge",?int.class);
m.setAccessible(true);?//?因?yàn)閷懗蓀rivate?所以這里必須設(shè)置
m.invoke(b,?26);
System.out.println(a.toString());
System.out.println(b.toString());
System.out.println(b.getName());
System.out.println(b.getAge());
}
public?static?void?main(String[]?args)?throws?InvocationTargetException?{
ReflectionTest?rt?=?new?ReflectionTest();
try?{
rt.testSetMethod();
}?catch?(NoSuchMethodException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}?catch?(SecurityException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}?catch?(IllegalAccessException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}?catch?(IllegalArgumentException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}?catch?(InstantiationException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
}
set 方法System.out.println(classA.getDeclaredMethod("getAge").invoke(a));
get 方法Method?m?=?classA.getDeclaredMethod("setAge",?int.class);
m.setAccessible(true);//因?yàn)閷懗蓀rivate?所以這里必須設(shè)置
m.invoke(b,?26);
1.9.3.3.?static 方法調(diào)用
Class?cls?=?Class.forName("cn.netkiller.reflect.Student");
Method?setMethod?=?cls.getDeclaredMethod("setAge",int.class);
setMethod.invoke(cls.newInstance(),?15);
總結(jié)
以上是生活随笔為你收集整理的java 反射 框架_Java 反射,开发框架必备技能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lcd1602c语言程序分析,全方位解析
- 下一篇: 巧用Java8中的Stream,让集合操