//首先我们先创建一个实体类
public class Dog {
private int did;
int age;
public String dname;
private void eat(){
System.out.println("私有的吃方法");
}
void sleep(){
System.out.println("小狗睡觉");
}
public void jiao(){
System.out.println("小狗要叫");
}
}
/*
定义一个Test类,通过反射进行实例化、获取属性、函数等等
*/
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Dog dog = new Dog();
// dog.jiao();
//我们直接可以通过 对象名 或者类名
//在运行阶段获取嵌class对象(原生所在类)
//第一种:通过已有对象 来方向获取
Class clazz = dog.getClass(); //class pojo.Dog
String name = clazz.getName(); //pojo.Dog
//第二种
Class clazz1=Dog.class;
//第三种 通过forName
Class clazz2 = Class.forName("pojo.Dog");
Object ob = clazz.newInstance(); // 使用反射来创建对象 注意:如果 Class<> 没有指定类型 则使用Object来进行接收
//上述三种 哪一个相当于更好一点
//第三种更能体现反射的本质 因为
//第一种 还需要提前创建对象 有点奇怪
//第二种 需要提前导包 如果不引入包 则报错 (两个类之间不可避免的会产生耦合)
//第三种 是不需要跟其他包提前创建建立联系的 我只需要通过字符串去反射即可
clazz.getPackage().getName(); //获取到包名 pojo
clazz.getSimpleName(); //获取到类名 Dog
clazz.getName(); //获取到完整的路径 pojo.Dog
//1,获取函数的两种方式
//获取方法 获取此类中的Object和公共的方法
Method[] methods = clazz.getMethods();//获取该类中所有的方法包括继承得来的方法
for (Method m:methods
)
System.out.println(m.getName()); { //获取方法名
}
System.out.println("===========================");
//只获取本类中声明的函数,不包括默认继承的Object 包括私有 被保护的
Method[] methods1 = clazz.getDeclaredMethods();
for (Method m:methods1
)
System.out.println(m.getName()); { //获取方法名
}
System.out.println("-----------------------");
//2. 获取属性的
Field[] fields = clazz.getFields(); //能获取所有公开的成员变量。包括继承而来的
Field[] declaredFields = clazz.getDeclaredFields();//获取自己声明的属性,不获取所继承的成员变量
//自行输出测试
for (Field m:fields
)
System.out.println(m.getName()+","+m.getType()); { //获取属性 dname,class java.lang.String 获取到类型
}
System.out.println("--=-=-==-==-==-=-=-=-=-");
for (Field m:declaredFields
)
System.out.println(m.getName()); { //获取自己所定义的成员变量 局部变量拿不到 不拿所继承的
}
//3. 获取构造方法
Constructor[] constructors = clazz.getConstructors(); //获取所有能访问到的 包括继承父类的
Constructor[] clazzDeclaredConstructors = clazz.getDeclaredConstructors(); //获取现有自己所定义的构造方法
}