文章目录
在java中允许通过类的对象来取得类的信息
文章目录
对于反射二字的理解:
通过声明对象的类型,来实例化对象,反过来通过实例化的对象来取得Class对象
Object类中定义了一个getClass(),这个方法返回一个Class类型的返回值
视频中对于反射的定义:
Class类中的常用方式
实例化Class对象的三种方式:
第一种 forName()
c1= Class.forName("反射.X");
最主要的使用的方式
第二种 类.class
c3=X.class;
第三种 对象.getClass()
c2=new X().getClass();
Class的使用
使用class类中的newInstance()方法来实例化对象
package 反射;
class Person
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class<?> c1 =null;
try {
c1 =Class.forName("反射.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Person per = (Person) c1.newInstance();
per.setName("yang");
System.out.println(per.getName());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
使用以上操作中,类中必须存在无參构造方法,不然无法通过编译
若类中不存在无參构造方法,则需要指定调用的构造方法,并传递参数,所以在一般的额java反射操作中一般都要有无參构造方法。
package 反射;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class Person
{
private String name;
public Person(String name)
{
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Demo2 {
public static void main(String[] args) throws IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
Class<?> c1 =null;
try {
c1 =Class.forName("反射.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Constructor<?> cons[] =null;
cons=c1.getConstructors();
Person per = (Person)cons[0].newInstance("yang");
per.setName("yang");
System.out.println(per.getName());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射的应用
反射机制的深入
取得一个类的接口
Class<?> c
Class<?> c1[] = c.getInterfaces();
此方法返回此类所实现的接口数组
取得一个类的父类
class<?> c1 =c.getSuperClass();
取得一个类的所有构造方法
Constructor<?> con[] =c1.getConstructors();
代码例子:
实现结果:
取得全部方法
我是分割线---------------------------------
实例代码
结果:
取得一个类中的全部属性
实例:
结果:
深入理解java反射机制
1,通过反射调用类中的方法
实例
不需要已经生成好的对象,在任意的地方直接调用类中的方法
sayhello是方法名称
调用无參方法
调用有參方法
2、通过反射调用类setter和getter (必须掌握)
实例:
3、通过反射设置类的flied
比较简单,但需要注意的是访问私有属性的时候,要在外部能够访问则需要使用setAcessiable()方法来设置此属性对外部可见
实例:
本博客资源来自mldn视频教程,仅用于学习交流,侵删。