码迷,mamicode.com
首页 > 编程语言 > 详细

java的反射机制

时间:2019-11-02 00:24:04      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:构造方法   test   width   返回   for   ring   class类   类型   方式   

newInstance方法:通过反射生成Student对象,

Class c=Class.forName("com.Student");             

Student s1=(Student)c.newInstance();//调用默认的无参构造函数

//想调用三个参数的构造

Constructor con=c.getConstructor(String.class,int.class,String.class);  //用Consructor接收,参数指定类型的Class对象
con.newInstance("lauraa",20,"women");
(与这样的操作相同: Student s=new Student("lauraa",20,"women");

通过反射生成对象
重写toString方法后,可打印 Student{name=‘lauraa‘, age=20, sex=‘women‘}
Class c2=Class.forName("com.load.Student");//包路径

Student s1=(Student)c2.newInstance();

Constructor con=c2.getConstructor(String.class,int.class,String.class); //想调用三个参数的构造,参数为类型.class
Student stu=(Student)con.newInstance("lauraa",20,"women"); //后面的newInstance是Object类型,所以强转为Student类型;传入参数的值用stu接收
System.out.println(stu);

当一个类的构造函数被私有化,不能new对象访问该类。可以通过反射访问

技术图片

 

 通过反射访问构造函数:

1.获取Class对象(Class类的c变量里面包含该类的全部信息)

2.c.getDeclaredConstructor()调用该类所有的构造函数用Constructor类的c4接收

3.设置c4是可访问的

4.再调用newInstance()函数传入构造函数的参数,可以填null或不填

        //Test t=new Test();//私有构造函数,不能new
        Class c=Test.class;
        //c.newInstance(); //运行异常
Class com.load.ClassLoadTest can not access a member of class com.load.Test with modifiers "private"
Constructor c4=c.getDeclaredConstructor();//打印构造函数
//若想调用带参数的构造函数,在getDeclaredConstructor()里面加入int.class,在下面的newInstance方法里面传值
c4.setAccessible(true); c4.newInstance();
       class Test{
private Test(){
System.out.println("测试类的私有构造");
}
private Test(int a){
int b=a;
System.out.println("b:"+b);
}
}

技术图片

 

 反射的不足:但是,通过反射任意访问对象的私有成员并改变成员变量的值,类得不到保护

public class ClassLoadTest {
public static void main(String[] args) throws Exception
//访问私有方法
 Test t1=new Test();
Method m=c.getDeclaredMethod("show",null);
m.setAccessible(true);
m.invoke(t1,null);
//访问私有成员变量并改变值
Field f=c.getDeclaredField("ma");//参数为String类型,所以""双引号变量
f.setAccessible(true);
f.set(t1,8); //将属性值设为8
m.invoke(t1,null); //再次调用show方法打印私有属性ma的值
}
}
class Test{
private int ma = 10;
public Test(){
System.out.println("测试类的私有构造");
}
private void show(){
System.out.println("ma:" + ma);
}
}

技术图片

 

 总结:反射的步骤

         * 通过Java的反射访问类的成员或者是构造对象(访问构造函数),步骤是:
         * 1. 先获取类的Class对象
         * 2. 构造函数类Constructor,方法类Method, 属性类Field
                通过Class的getDeclaredConstructor,getDeclaredMethod,  getDeclaredField三个方法,分别获取三个对象
         * 3. 如果方法是private的,需要调用反射对象的setAccessible设置访问权限
         * 4. 访问相应的成员
         *    newInstance - 构造对象
         *    invoke - 成员方法调用
         *    set - 成员变量设置

解释java的反射:       

         *  Java之所以支持反射,是因为java的每一个类,都有一个Class对象,
         *  通过Class对象可以获取这个类的构造方法,成员方法,成员变量,通过 反射的方式进行调用或者修改,而不是通常的通过对象调用相应的成员进行访问,反               射提供了setAccessible方法,可以通过返回访问对象任意的成员
         *  反射涉及的类,都在java.lang.reflect包下面,分别是import java.lang.reflect.Field;    import java.lang.reflect.Method;

 

java的反射机制

标签:构造方法   test   width   返回   for   ring   class类   类型   方式   

原文地址:https://www.cnblogs.com/laurarararararara/p/11780112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!