Java反射的基础

反射的概述:

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。


反射的基本用法:

    1.   通过反射获取类的构造方法、成员变量、成员方法:

        首先来一个Student类,类中包括这种修饰符修饰的成员变量、构造方法、成员方法。(为了演示反射的功能才这样写)。

public class Student implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 2164707840078420502L;
	private String name;
	public int age;
	
	private Student(String name){
		this.name=name;
	}
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	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 "Student [name=" + name + ", age=" + age + "]";
	}
        //私有的无参无返回值方法
        private void method (){
		System.out.println("method");
	}
	//私有的有参有返回值的方法
	private String method2(String str){
		return str+"你是真的皮";
	}
}

    获取构造方法

//获取字节码对象
    Class<?> clazz = Class.forName("com.reflect.Student");
//创建对象,简化的写法调用无参构造的方法创建对象
    Object obj=clazz.newInstance();
//获取public的构造方法
    Constructor<?>[] cs=clazz.getConstructors();
    for(Constructor<?> c:cs){
	System.out.println(c);
    }
		
    System.out.println("-------------------------------");
    //获取所有的构造方法
    Constructor<?>[]  css=clazz.getDeclaredConstructors();
    for(Constructor<?> s:css){
	System.out.println(s);
    }
    System.out.println("-------------------------------");
    //单独获取某个构造
    Constructor<?> constructor = clazz.getDeclaredConstructor(String.class,int.class);
    System.out.println(constructor);
    //----------------[使用构造方法]-----------------
    Object object = constructor.newInstance("xiaoming",12);
    System.out.println(object);
		
    //使用私有构造
    Constructor<?> con=clazz.getDeclaredConstructor(String.class);
    //暴力访问
    con.setAccessible(true);
    Object obj=con.newInstance("xiao");
    System.out.println(obj);

    获取成员变量

    //获取字节码对象
    Class<?> clazz = Class.forName("com.reflect.Student");
    //创建对象,简化的写法调用无参构造的方法创建对象
    Object obj=clazz.newInstance();
    //获取所有的public成员变量
    Field[] fields = clazz.getFields();
    for(Field f:fields){
	System.out.println(f);
    }
	System.out.println("---------------------------------");
    //获取所有的成员变量
    Field[] field=clazz.getDeclaredFields();
    for(Field f:field){
	System.out.println(f);
    }
    System.out.println("----------------------------------");
    //获取指定的public成员变量
    Field f=clazz.getField("age");
    System.out.println(f);
    System.out.println("----------------------------------");
    //获取指定的成员变量,包括非public
    Field f2=clazz.getDeclaredField("name");
    System.out.println(f2);                    //只能查看
		
    //f2.set(obj, "xiaoling");               //错误的赋值
    //System.out.println(f2.get(obj));       //错误的获取
		
    f2.setAccessible(true);                    //暴力访问,可以设置值以及获取值
    f2.set(obj, "老王");                       //设置值
    System.out.println(f2.get(obj));          //获取值
    System.out.println(obj);

    获取成员方法

        
    //获取字节码对象
    Class<?> clazz = Class.forName("com.reflect.Student");
    //创建对象,简化的写法调用无参构造的方法创建对象
    Object obj=clazz.newInstance();
    //获取所有的方法
    Method[] methods=clazz.getDeclaredMethods();
    //System.out.println(methods);
		
    //获取指定的方法(无参数,无返回值)
    Method method1 = clazz.getDeclaredMethod("method");
    method1.setAccessible(true);    //暴力访问
    method1.invoke(obj);
		
    //获取指定的方法(有参数,有返回值)
    Method method2=clazz.getDeclaredMethod("method2",String.class);
    method2.setAccessible(true);   //暴力访问
    Object invoke = method2.invoke(obj, "呵呵");
    System.out.println(invoke);




阅读更多
文章标签: Java 反射
个人分类: Java
上一篇Java集合之LinkedList
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭