CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
目录
一、反射概述
1.作用
2.优点
二、Class类
1.获取Class对象的三种方法
1.Class.forName("全类名")
2.类名.class
3.对象.getClass()
2.获取功能
1.获取成员变量
2.获取构造方法
3.获取成员方法
4.获取类名
程序通过类创建对象,反射将这一过程进行反转,通过实例化对象来获取所属类的信息。
在程序运行状态时,构造任意一个类的对象、获取任意一个对象所属的类的信息、调用任意一个类的成员变量和方法、获取任意一个对象的属性和方法。
可以在程序运行期间动态的创建和编译对象,不需要再次重新编译,就可以更新。
将字节码文件加载进内存,返回Class对象
1.举例
定义一个Student类,获取Class对象
2.代码
package itcast;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package itcast;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class cls1=Class.forName("itcast.Student");
System.out.println(cls1);
}
}
3.执行结果
相关报错
Exception in thread "main" java.lang.ClassNotFoundException
原因:
Class.forName()里的包或类写错了
解决方法
复制获取Class对象的类和包,粘上去
通过类名的属性class获取
1.举例
定义一个Student类,获取Class对象
2.代码
package itcast;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class cls1=Student.class;
System.out.println(cls1);
}
}
3.执行结果
1.举例
定义一个Student类,获取Class对象
2.代码
package itcast;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Student stu=new Student();
Class cls1=stu.getClass();
System.out.println(cls1);
}
}
3.执行结果
操作
1.设置值
set(Object obj,Object value)
2.获取值
get(Object obj)
getFields()
获取所有public修饰的的成员变量
代码
package itcast;
public class Student {
public String name;
public int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package itcast;
import java.lang.reflect.Field;
public class ReflectDemo {
public static void main(String[] args){
Class StudentClass=Student.class;
Field[] field=StudentClass.getFields();
for (Field field2 : field) {
System.out.println(field2);
}
}
}
执行结果
getField(String name)
指定名称的public修饰的成员变量
getDeclaredFields()
获取所有的的成员变量,不考虑修饰符
getDeclaredField(String name)
指定名称的成员变量,不考虑修饰符
创建对象
T newInstance(Object... initargs)
如果使用的是无参构造方法创建对象,使用Class对象的newInstance
getConstructors()
代码
package itcast;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectDemo {
public static void main(String[] args) throws Exception{
Class StudentClass=Student.class;
Constructor constructor=StudentClass.getConstructor(String.class,int.class);
System.out.println(constructor);
Object student1=constructor.newInstance("老六",18);
System.out.println(student1);
Object student2=StudentClass.newInstance();//无参函数时使用
System.out.println(student2);
}
}
执行结果
getConstructor(类>... parameterTypes)
getDeclaredConstructor(类>... parameterTypes)
getDeclaredConstructors()
getMethods()
getMethod(String name,类>... parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name,类>... parameterTypes)
getName()