1.動態(tài)語言
C++,C,JAVA不是動態(tài)語言 JavaScript是一門動態(tài)語言
例如
function test(){
var s="var a=3;var b=5; alter(a+b);"
eval(s);
}
但是Java也具有一定的動態(tài)性
2.反射機制(reflection)
1.程序在運行的時候,可以動態(tài)的加載一個類,對于任何一個加載的類,都能夠知道這個類的所有屬性和方法,對于任何一個對象都能夠調(diào)用這個類的方法和屬性。
Class c=Class.forName(" 包+類名 ")
來自java.lang.Class
2.它可以將數(shù)組,接口,類等等各種放到一個Class對象里,通過這個對象可以調(diào)用類里面的數(shù)據(jù)。
3. Class對象的獲取的三種方法
1.Class.forName();
2.類
3.類.getClass();
示例如下
public class reflection
{
public static void main(String[] args)
{
String name="cn.sst.gao.Stu";
try
{
Class src=Class.forName(name); //一個類只能對應(yīng)一個Class對象
Class strClazz=String.class;
Class src22=name.getClass();
System.out.println(src.hashCode());
System.out.println(strClazz.hashCode());
System.out.println(src22.hashCode());
//對于數(shù)組是按維度 和類型進行分類的
int[] p=new int[10];
int[] s=new int[20];
Class srcc=p.getClass();
Class srcc1=s.getClass();
System.out.println(srcc.hashCode());
System.out.println(srcc1.hashCode());
} catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. 通過反射返回類的信息
1.獲取類的名字
getName
2.獲取屬性 -->Field -------需要先返回這個類型的對象 ---Class對象.
- getFields 獲取所有的Public類型的
- getDeclaredFields 獲取所有的Field
- getDeclaredField(" 屬性的名字") 獲取某個屬性名字的屬性
3.獲取方法 --- >Method - getDeclaredMethods()得到所有的方法
- getDeclaredMethod("getAge",null); 得到某個方法 1.傳入方法的名字2,如果有參數(shù)則傳入 類型.class對象
4.構(gòu)造器 --> Constructor() - getDeclaredConstructors() 得到所有的構(gòu)造器
- getDeclaredConstructor() 得到某個指定的構(gòu)造器 需要傳入?yún)?shù)(如上)
5.獲得注解 ---->SxtTable
1.獲得類的注解 - Class對象.getAnnotations() 獲得所有注解
- Class對象.getAnnotation(名字.class)獲得某個注解
2.獲得方法,屬性的注解 - 先獲取屬性,方法等
- 方法如上
5.通過反射獲得建立Class對象,并對其中的屬性進行操作
1.獲取Class對象的類的對象
- 對象 p=Class對象.newInstance();
User p=(User) clazz.newInstance(); //調(diào)用了User的無參構(gòu)造方法
- 先建立構(gòu)造器 再通過構(gòu)造器進行創(chuàng)建
Constructor<User> c=clazz.getDeclaredConstructor(int.class,int.class,String.class);
User p1=c.newInstance(10001,18,"小風(fēng)");
2.獲取方法
- .先獲取方法 Method p=Class對象.getDeclaredMethod("方法名",參數(shù));
- method.invoke(對象, 參數(shù));
User p2=(User) clazz.newInstance();
Method method=clazz.getDeclaredMethod("setId", int.class);
method.invoke(p2, 10);
3.獲取屬性
- 先獲取屬性 Field p=Class對象.getDeclaredField("名字");
--------如果是私有的 需要p.setAccessible(true); - f.set(p3,20);
User p3=(User) clazz.newInstance();
Field f=clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(p3,20);
System.out.println(p3.getAge());