本人零基础学Java,至今学了一个多月了,今天学完反射这一内容,就来和大家分享一下。
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
可以先跳到最后看看学生类的内容有什么。
目录
一、获取class对象
我们有三种方式获取class对象 1:使用类的cLass属性来获取该类对应的cLass对象。举例:Student.class将会返回student类对应的cLass对象。 2:调用对象的getClass()方法,返回该对象所属类对应的cLass对象。 该方法是object类中的方法,所有的Java对象都可以调用该方法。 3:使用cLass类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径。
我们主要使用第一和第三种方法。
其中Student是我创建的一个学生类,第三种是通过路径来访问类并创建对应的class对象。
//第一种
Class<Student> c1 = Student.class;
//第三种
Class<?> c2 = Class.forName("myReflect.demo01.Student");
System.out.println(c1 == c2);//这里通过输出可以得知两者是一样的
二、获取构造方法
我们的类里面的构造方法有公共的和私有的,他们的获取方法都不同。
1.获取公共
我们可以通过getConstructor()来获取公共构造方法(无参有参都可以)。
然后通过newInstance来把参数传入。
//创建class对象
Class<?> c = Class.forName("myReflect.demo01.Student");
//获取student类的构造方法
Constructor<?> con = c.getConstructor(String.class, int.class, String.class);
//输入参数
Object boj = con.newInstance("zs", 30, "gx");
System.out.println(boj);
2.获取私有
类中的私有构造方法是通过getDeclaredConstructor()来获取的,这个方法无论是公共还是私有都能获取到,建议后面都用这个方法。
在获取私有构造方法后,我们并不能直接使用,要通过另一个方法setAccessible(true)才能传入参数,括号里面填true就是为了取消访问检查。
Class<?> c = Class.forName("myReflect.demo01.Student");
//获取私有构造方法
Constructor<?> con = c.getDeclaredConstructor(String.class);
//暴力反射,值为true,取消访问检查
con.setAccessible(true);
//传入参数
Object obj = con.newInstance("zs");
.out.println(obj);
三、获取成员变量
这个和前面的构造方法差不多,同样有公共和私有。
1.获取公共成员变量
在这里,我们要用前面学到的获取构造方法来创建对象,然后去给成员变量赋值。
利用getField()可以获取公共成员变量。
Class<?> c = Class.forName("myReflect.demo01.Student");
//Field field = c.getField();获取公共成员变量
//Field fields[] = c.getDeclaredFields();//获取全部成员变量
//获取了公共成员变量 address
Field addressField = c.getField("address");
//获取无参构造方法创建对象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
addressField.set(obj,"xi'an");//给obj的成员变量addressField赋值
System.out.println(obj);
2.获取私有成员变量
利用getDeclaredField()可以获取全部成员变量(包括私有)。
这里同样建议在后面学习工作中使用这种方法。
Class<?> c = Class.forName("myReflect.demo01.Student");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
//获取私有成员变量 name
Field nameField = c.getDeclaredField("name");
//通过暴力反射,来取消访问检查
nameField.setAccessible(true);
//最后在给它赋值
nameField.set(obj,"zs");//给obj的私有成员变量nameField赋值
System.out.println(obj);
四、获取成员方法
1.获取公共成员方法
使用getMethod()方法来获取公共成员方法。
然后创建对象,利用invoke()方法来调用对象内的成员方法
Class<?> c = Class.forName("myReflect.demo01.Student");
Method method = c.getMethod();//获取公共成员方法
Method m = c.getMethod("method1");//成员方法对象拿到了,但是还没创建对象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
/*
在类或接口上提供有关单一方法的信息和访问权限
Object invoke (Object obj,object.. . args)在具有指定参数的指定对象上调用此方法对象表示的基础方法
object:返回值类型
obj:调用方法的对象
args:方法需要的参数*/
m.invoke(obj);
2.获取私有成员方法
这里利用getDeclaredMethod()方法来获取私有成员方法。
这里同样建议在后面学习工作中使用这种方法。
Class<?> c = Class.forName("myReflect.demo01.Student");
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();
//获取私有成员方法
Method m = c.getDeclaredMethod("function");
//暴力反射,取消访问检查
m.setAccessible(true);
//调用Student类中的私有成员方法
m.invoke(obj);
五、学生类内容
//成员变量,一个私有,一个默认,一个公共
private String name;
int age;
public String address;
//构造方法,一个私有,一个默认,两个公共
public Student() {
}
private Student(String name) {
this.name = name;
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
//成员方法,一个私有,三个公共
private void function(){
System.out.println("function");
}
public void method1(){
System.out.println("method");
}
public void method2(String s){
System.out.println("method:"+s);
}
public String method3(String s,int i){
return s + "," + i;
}
//重写toString()方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
在此记录我的学习收获成果,如果对你有帮助那我很高兴。