欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java的反射机制,

来源: javaer 分享于  点击 3936 次 点评:115

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,这样了解更深入。


                                                   

                                                    






相关文章

    暂无相关文章
相关栏目:

用户点评