1.思维导图
2.反射
反射是java语言的一种机制,利用反射机制动态的实例化对象(构造函数)、读写属性、调用方法
类对象获取全路径的三种方式:
1.Class.forName
2.类.class
3.类类的类对象的类实例化.getClass();
package com.LSZ.fs;
public class Q {
public static void main(String[] args) throws Exception {
// 类名.class
Class c = Student.class;
System.out.println(c);
// 对象名.getclass
Student s = new Student();
System.out.println(s.getClass());
// class.forname
Class forname = Class.forName("com.LSZ.fs.Student");
System.out.println(forname);
// 获取全限定名
System.out.println(c.getName());
// 获取类名
System.out.println(c.getSimpleName());
// 获取包名
System.out.println(c.getPackage());
}
}
3.反射的实例化
package com.LSZ.fs;
import java.lang.reflect.Constructor;
import java.util.Iterator;
public class demo {
public static void main(String[] args) throws Exception {
// 加载类对象
Class<Student> stu1 = (Class<Student>) Class.forName("com.demo.Student");
System.out.println("--------所有公有的构造方法---------");
Constructor[] constr = stu1.getConstructors();
for (Constructor constructor : constr) {
System.out.println(constructor);
}
System.out.println("------------私有构造方法----------------");
Constructor[] decon = stu1.getDeclaredConstructors();
for (Constructor constre : decon) {
System.out.println(constre);
}
System.out.println("---------共有的,有参构造方法---------");
Constructor<Student> c = stu1.getConstructor(String.class);
Student s1 = c.newInstance("s011");
System.out.println("---------私有构造方法 有参---------");
Constructor<Student> c2 = stu1.getDeclaredConstructor(Integer.class);
c2.setAccessible(true);// 打开访问权限
Student s2 = c2.newInstance(12);
}
}
输出:
静态加载
--------所有公有的构造方法---------
public com.LSZ.fs.Student(java.lang.String)
public com.LSZ.fs.Student()
public com.LSZ.fs.Student(java.lang.String,java.lang.String)
------------私有构造方法----------------
private com.LSZ.fs.Student(java.lang.Integer)
public com.LSZ.fs.Student(java.lang.String)
public com.LSZ.fs.Student()
public com.LSZ.fs.Student(java.lang.String,java.lang.String)
---------共有的,有参构造方法---------
有参构造方法
---------私有构造方法 有参---------
私有构造
获取成员方法以及调用
package com.LSZ.fs;
import java.lang.reflect.Method;
public class demo2 {
public static void main(String[] args) throws Exception {
// 加载类对象
Class<Student> stu1 = (Class<Student>) Class.forName("com.demo.Student");
// 获取成员方法hello()
System.out.println("--------成员方法hello()----------");
Method method = stu1.getMethod("hello", String.class);
// 参数1为方法名字 参数二为方法参数类型 无参方法不需要填写
// 获取Student对象
Student s = stu1.newInstance();
/*
* invok参数 参数1: 类实例 参数2:当前方法传递的参数值 返回值:方法的返回值 如果是void 那么返回null
*/
Object invoke1 = method.invoke(s, "张三");
System.out.println("返回值:" + invoke1);
// 获取私有方法add()
System.out.println("--------私有方法add()----------");
Method declmet = stu1.getDeclaredMethod("add", Integer.class, Integer.class);
declmet.setAccessible(true);
Student s1 = stu1.newInstance();
Object invoke2 = declmet.invoke(s1, 12, 2);
System.out.println("返回值:" + invoke2);
}
}
输出:
静态加载
--------成员方法hello()----------
无参构造方法
张三有参方法null
返回值:null
--------私有方法add()----------
无参构造方法
返回值:14