昨晚我刚开始看这个反射的视屏课,放了两节,电脑卡崩了。等了半小时,毫无动静。无奈之下,洗洗睡咯。今日无事重拾电脑,细细琢磨反射为何。
反射就是知道在虚拟机中运行的类叫啥名字嘛,有啥方法,构造方法成员变量,要传入什么参数。巴拉巴拉
具体真正信息在下:
反射的概述
什么是Java的反射机制?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
对于任意对象,都能够调用它的任意方法和属性
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
Java反射机制的作用:
用来编写一些通用性较高的代码或者框架的时候使用。
A.java 经过编译变为A.class,A.class到jvm中运行
反射常用对象的概述
Class Class对象:类的字节码文件被加载到内存所形成的一个对象
Class类的实例表示正在运行的Java应用程序中的类和接口
Constructor
关于类的单个构造方法的信息以及对它的访问权限
Field
Field提供有关类或接口的单个字段信息,以及对它的动态访问权限
Method
Method 提供关于类或接口上单独某个方法的信息
代码示例:
//先弄一个Person类用于测试
public class Person {
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + "]";
}
public String name;
private String sex;
public Person(String name, String sex) {
this.name = name;
this.sex = sex;
}
public Person() {
super();
}
// public String getName() {
// return name;
// }
// public void setName(String name) {
// this.name = name;
// }
// public String getSex() {
// return sex;
// }
// public void setSex(String sex) {
// this.sex = sex;
// }
public String sayHello(String name){
return "hello"+name;
}
public void eat(){
System.out.println("yamiyami");
}
private void run(){
System.out.println("running");
}
}
//测试class对象
public class ClassTest {
@Test
/*
* 获得Class对象
* 1、通过类名.class
* 2、对象.getClass()
* 3、Class.forName();
*/
public void demo1() throws ClassNotFoundException {
// 1、通过类名.class
Class class1 = Person.class;
// 2、对象.getClass()
Person p = new Person();
Class class2 = p.getClass();
// 3、Class.forName();
Class class3 = Class.forName("com.imooc.reflect.test.Person");
}
}
//测试constructor对象
public class ConstructorTest {
@Test
/*
* 获得无参的构造方法
*/
public void demo1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class c1= Class.forName("com.imooc.reflect.test.Person");
Constructor con=c1.getConstructor();
Person p=(Person)con.newInstance();//相当于Person person=new Person();
p.eat();
}
@Test
/*
* 获得有参的构造方法
*/
public void demo2() throws Exception{
Class c2=Class.forName("com.imooc.reflect.test.Person");
Constructor c=c2.getConstructor(String.class,String.class);
Person p=(Person)c.newInstance("a","sd");//Person p=new Person("a","sd");
System.out.println(p);
}
}
//测试Field对象
public class FiledTest {
@Test
// 测试公有属性
public void demo1() throws Exception{
//获得class
Class c=Class.forName("com.imooc.reflect.test.Person");
//获得属性
Field field=c.getField("name");
//操作属性
Person p=(Person)c.newInstance();
field.set(p, "sss");//p.name="sss";
Object obj=field.get(p);
System.out.println(obj);
}
@Test
//测试私有属性
public void demo2() throws Exception, SecurityException{
//获得class
Class c2=Class.forName("com.imooc.reflect.test.Person");
//获得私有属性
Field field =c2.getDeclaredField("sex");
//操作属性
Person p=(Person)c2.newInstance();
//私有属性需要设置一个可访问的权限
field.setAccessible(true);
field.set(p, "male");
//获取值
Object obj=field.get(p);
System.out.println(obj);
System.out.println(p);
}
}
//测试Method对象
public class MethodTest {
@Test
//测试公有方法
public void demo1() throws Exception{
Class class1=Class.forName("com.imooc.reflect.test.Person");
//实例化
Person p=(Person)class1.newInstance();
Method method=class1.getMethod("eat");
//执行该方法
method.invoke(p);
}
@Test
//测试私有方法
public void demo2() throws Exception{
Class class1=Class.forName("com.imooc.reflect.test.Person");
//实例化
Person p=(Person)class1.newInstance();
//获得该方法
Method method=class1.getDeclaredMethod("run");
//设置私有方法的访问权限
method.setAccessible(true);
//执行该方法
method.invoke(p);
}
@Test
//测试私有方法带参数
public void demo3() throws Exception{
Class class1=Class.forName("com.imooc.reflect.test.Person");
//实例化
Person p=(Person)class1.newInstance();
//获得该方法
Method method=class1.getDeclaredMethod("sayHello",String.class);
//设置私有方法的访问权限
method.setAccessible(true);
//执行该方法
Object obj=method.invoke(p, "jack");
System.out.println(obj);
}
}
最后宣传下我个人的微信公众号,微信搜索:可及的小屋,有志向整副业,娱乐的程序员们,欢迎您的到来。谢谢。
100G程序员资料,自取哦!!