java的反射机制,
java的反射机制,
java中一直有一个杀手锏级别的东西存在,这就是反射机制。有了它简直可以为所欲为,它打破了java的封装性,
有点剑走偏锋的感觉。在很多的框架里也大量的应用,比如大名鼎鼎的spring ioc容器就用到了。所以这是必须掌握的。
我对于反射的理解是:通过new产生的对象,然后访问属性、调用方法,这是正向的。反射就是反过来从方法出发,
从属性等等出发,出发点不一样。在这之前必须要了解一个东西,在java中有Class这么一个类,也可以叫类的描述符或者
叫类类。它维护我们每一个java类信息的,凡是我们在java类中看到的一切,比如属性、方法、构造器、代码块、修饰词、
关键字等等所有的都在Class这里面维护。反射的基础用法很简单,但是想利用反射搞事情,那就得需要功底了。
获取Class有如下几种方式:1、通过类的.class属性获取
Class clazz = Integer.class
2、通过对象获取
String str = "reflect";
Class Clazz = str.getClass();
3、通过静态方法获取:参数是全限定类名
Class Clazz = Class.forName("com.mysql.jdbc.Driver");
首先我们来一个person类
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name){
this.name = name;
}
private void sayHello(){
System.out.println("sayHello");
}
public static void cc(){
System.out.println("cc");
}
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;
}
}
通过反射得到对象
@Test
public void test1() throws Exception{
//得到类描述符
Class<Person> clazz = Person.class;
//创建对象
Person p = clazz.newInstance();
p.setName("反射");
System.out.println(p.getName());
}
通过Constructor来创建对象
@Test
public void test2() throws Exception{
//得到类描述符
Class<Person> clazz = Person.class;
//返回通过参数类型指定的构造器
Constructor<?> c = clazz.getConstructor(String.class);
//得到构造器数组
Constructor<?>[] cons = clazz.getDeclaredConstructors();
for(Constructor<?> con : cons){
//用构造器创建对象,通过参数列表来区分调用哪个构造器
Person p = (Person) con.newInstance("luohp");
System.out.println(p.getName());
}
}
注:获取构造器有其他重载方法,1、有带Declared的:只返回访问权限是public的构造
2、不带Declared的:返回public和非public的,自然也包括private。
通过Class描述符获取Method
@Test
public void test3() throws Exception{
Class<Person> clazz = Person.class;
Person p = clazz.newInstance();
//返回通过方法名+参数类型指定的方法对象
Method m = clazz.getMethod("setName", String.class);
//调用setName方法,参数1:哪个对象的setName() 参数2:setName方法的参数
m.invoke(p, "jetty");
}
}
注:获取Method有其他重载方法,1、有带Declared的:只返回在本类中声明的,包括private的,不包括继承的。
2、不带Declared的:返回本类+继承的,但不包括private的。
通过Class描述符获取Feild
@Test
public void test4() throws Exception{
Class<Person> clazz = Person.class;
//获取属性对象集合
Field[] fields = clazz.getDeclaredFields();
for(Field f : fields){
System.out.println(f.getName()+":"+f.getType());
}
}
反射提供了很多方法可以多看看API,这样了解更深入。
相关文章
- 暂无相关文章
用户点评