java反射笔记

反射***

       应用在一些通用性比较高的代码中

       后面的学到的框架,大多数都是用使用反射来实现(面试题)

菜鸟与骨灰级区别   代码的命名方式   ; debug调试  ;对反射的理解程度

      

在框架开发中,都是基于配置文件开发的

       再配置文件中配置配置了类,可以通过反射得到类中的 所有内容 ,可以让类中的某个方法来执行

类中的所有内容  属性  没有参数的构造方法  有参数的构造方法、普通方法

画图分析反射原理

       首先把java文件保存到本地硬盘

       编译  成class文件

       使用jvm 把class 文件通过类加载器加载到内存中

       万事万物皆对象  class文件在内存中使用class类表示

       当使用反射的时候 首先获取到class类 得到这个类之后,就可以 得到class文件的所有内容

-       包含属性 构造方法 普通方法

属性通过一个类  Filed

构造方法 通过一个类  Constructor

普通方法 通过一个类 Method

16使用反射操作类里面的属性

  首先获取到class类

//获取Class类  三种方式

       

        Class class1 = Person.class;

        Class class2 = new Person().getClass();

        Class class3 = Class.forName("cn.itcast.test09.Person");

比如  要对一个类进行实例化 可以用new  不使用new 怎么获取  ?

//得到Class

       

 Class c3 = Class.forName("cn.itcast.test09.Person");

        //得到Person类的实例

     

   Person p = (Person) c3.newInstance();

 Person类

package cn.itcast.test09;

public class Person {
    //属性
    private String name;
    private String id;
    //没有参数的构造方法
    public Person(){}
    //有参数的构造方法
    public Person(String name, String id) {
        super();
        this.name = name;
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    

}
//使用泛型操作普通方法  setName
    //使用Method类表示普通方法
    @Test
    public void test4() throws Exception {
        //得到Class类
        Class c4 = Class.forName("cn.itcast.test09.Person");
        //得到Person实例
        Person p4 = (Person) c4.newInstance();
        //得到普通的方法
        //c4.getDeclaredMethods();//得到所有的普通方法   用的很少
        //下面方法解析  传递两个参数,第一个参数,方法名称;第二个参数 ,通过方法设置的值
        Method m1 = c4.getDeclaredMethod("setName",String.class);
        //若操作的是私有方法,需要来设置值为true    m1.seAccessible(true);
        
        //让setName方法执行 ,执行设置值
        //invoke(p4,"niuqi")  传递两个参数  第一个参数  Person的一个实例,第二个参数,设置的值
        m1.invoke(p4, "niuqi");
        System.out.println(p4.getName());
        
        //当操作的方法是静态方法的时候,因为静态方法调用的方式是  类名,不需要类的实例
        //使用反射操作静态方式的时候,也是不需要实例   m1.invoke(null,"niuqi")
    }
//操作name属性
@Test
public void test3(){
try{
//得到class类
Class c2 = Class.forName("cn.itcast.test09.Person");
//得到name属性

Person p11 = (Person) c2.newInstance();
//c2.getDeclaredFields();//表示得到所有的属性//用的很少 了解就行
Field f1 = c2.getDeclaredField("name");

//设置可以操作私有的属性 
f1.setAccessible(true);
//设置name值
f1.set(p11,"wangwu"); //相当于 p.name = "wangwu";
System.out.println(f1.get(p11)); //相当于p.name

}catch (Exception e) {
e.printStackTrace();
}
}

  

//操作有参数的构造方法
@Test
public void test2() throws Exception{
//得到Class
Class c1 = Class.forName("cn.itcast.test09.Person");
//使用有参数的构造方法
//c1.getConstructors();//获取所有的构造方法 这个方法

//传递的是有参数的构造方法里面的参数类型 ,类型使用class形式传递
Constructor cs = c1.getConstructor(String.class,String.class);
//通过有参数的构造方法里面的参数类型,类型使用class形式传递
Person p1 = (Person) cs.newInstance("lisi","100");
System.out.println(p1.getName() + " " + p1.getId());
}

 

//操作无参数构造方法

    @Test

    public void test1() throws Exception{

        //得到Class

        Class c3 = Class.forName("cn.itcast.test09.Person");

        //得到Person类的实例

        Person p = (Person) c3.newInstance();

        //设置值

        p.setName("zhangsan");

        System.out.println(p.getName());

       

    }
原文地址:https://www.cnblogs.com/mzdljgz/p/10388874.html