1.动态语言
C++,C,JAVA不是动态语言 JavaScript是一门动态语言
例如
function test(){
var s="var a=3;var b=5; alter(a+b);"
eval(s);
}
但是Java也具有一定的动态性
2.反射机制(reflection)
1.程序在运行的时候,可以动态的加载一个类,对于任何一个加载的类,都能够知道这个类的所有属性和方法,对于任何一个对象都能够调用这个类的方法和属性。
Class c=Class.forName(" 包+类名 ")
来自java.lang.Class
2.它可以将数组,接口,类等等各种放到一个Class对象里,通过这个对象可以调用类里面的数据。
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); //一个类只能对应一个Class对象
Class strClazz=String.class;
Class src22=name.getClass();
System.out.println(src.hashCode());
System.out.println(strClazz.hashCode());
System.out.println(src22.hashCode());
//对于数组是按维度 和类型进行分类的
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,如果有参数则传入 类型.class对象
4.构造器 --> Constructor() - getDeclaredConstructors() 得到所有的构造器
- getDeclaredConstructor() 得到某个指定的构造器 需要传入参数(如上)
5.获得注解 ---->SxtTable
1.获得类的注解 - Class对象.getAnnotations() 获得所有注解
- Class对象.getAnnotation(名字.class)获得某个注解
2.获得方法,属性的注解 - 先获取属性,方法等
- 方法如上
5.通过反射获得建立Class对象,并对其中的属性进行操作
1.获取Class对象的类的对象
- 对象 p=Class对象.newInstance();
User p=(User) clazz.newInstance(); //调用了User的无参构造方法
- 先建立构造器 再通过构造器进行创建
Constructor<User> c=clazz.getDeclaredConstructor(int.class,int.class,String.class);
User p1=c.newInstance(10001,18,"小风");
2.获取方法
- .先获取方法 Method p=Class对象.getDeclaredMethod("方法名",参数);
- method.invoke(对象, 参数);
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());