*首先,为我偷了这么多天懒道个歉。果然,人一安逸下来,就会堕落。
今天讲一下简单的java反射。用于反射的入门
1.什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能都知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制;
2.反射的作用
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。
图书类
@Data
//为lombok插件中的注解 为类提供getXX() setXX() equals()、hashCode()、toString()方法
public class BookInfo {
private Integer price;//书的价格
private String name;//书名
private BookInfo(Integer price, String name)//私有构造器
{
this.price=price;
this.name=name;
System.out.println("这是私有的构造器");
}
public BookInfo(Integer price)//公有构造器
{
this.price=price;
}
public BookInfo()//共有构造器
{
}
}
反射讲解及测试
public class test {
@Test
public void test1() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//1获取类的三种方式
Class cls1=BookInfo.class;
Class cls2=new BookInfo().getClass();
Class cls3=Class.forName("com.rd.pojo.BookInfo"); //字符串内部的组成是包+类名
// 我们通常用的是反射的第三种方式来获取某个类
// 例如原生态的jdbc中class.forName("com.mysql.cj.Driver");其实就是利用了反射获取Driver类的内容
//2.获取类以后,常用来获得该类的构造器,属性,方法。下面一个一个介绍
//2.1获取类的构造器
//获取所有的构造器,包括私有和公有(方法中含有Declared就代表私有的一起获取)
Constructor[] constructors= cls3.getDeclaredConstructors();
for(Constructor con:constructors)
System.out.println(con);
//获取所有公有构造器
Constructor[] constructors1= cls3.getConstructors();
//获取指定的构造器 (参数为指定构造器的参数列表类型的字节码 如Integer.class 如果是无参,则填null)
Constructor constructor=cls3.getDeclaredConstructor(null);
Constructor constructor1=cls3.getDeclaredConstructor(Integer.class);
Constructor constructor2=cls3.getDeclaredConstructor(Integer.class,String.class);
System.out.println(constructor);
System.out.println(constructor2);
//通过构造器来实例化对象(创建对象),如下 ,用newInstance()方法
BookInfo bk1=(BookInfo) constructor1.newInstance(100);//通过构造器来创建对象 其实Java中创建对象的实质就是调用构造方法
System.out.println(bk1.getPrice());
//如果通过私有构造器来实例化对象 则需要先取消语法检测
constructor2.setAccessible(true); //取消语法检测
BookInfo bk2=(BookInfo) constructor2.newInstance(101,"java反射全解");
System.out.println(bk2);
//如果通过无参构造器来实例化对象 可以直接cls3.newInstance();当然一般还是按规范来,没有这么写
//2.2.获得类中的属性
Field[] f_= cls3.getDeclaredFields();//获得全部属性 私有和共有
Field f_price=cls3.getDeclaredField("price");//字符串中的内容和BookInfo里的属性保持一致
//对属性进行读写操作
//考虑到price属性是私有的,需要先取消语法检测
f_price.setAccessible(true);//取消语法检测
//设置上面已创建的对象bk2的属性值
f_price.set(bk2,103);
//输出该图书对象的价格
System.out.println(f_price.get(bk2));
//2.3.获得类中的普通方法
Method[] methods=cls3.getDeclaredMethods();//获得类中的所有方法
Method methods1=cls3.getDeclaredMethod("setPrice",Integer.class);//获得类中的所有方法
//如果该方法无参数,则Integer.class填null ,多个参数,则写多个.class
//方法的调用
methods1.invoke(bk1,10001);
System.out.println(bk1.getPrice());//输出bk1对象的price,看是否已经改成了10001,是否调用成功。
}
}
在代码中做了详细解释,不懂的可以留言。
反射主要在后面的框架中用的多,接下来,终于进入到spring的学习了,加油。