在运行中发现类中的信息并使用,比如运行时,将类中的成员变量,方法,构造方法等,创建出一个个对应的对象。
java.lang包中存在一个Class类。 该类的实例,表示的是在java运行时的类或接口。JVM运行期间,每个类都是一个class对象。
可以通过类名.class、(引用类型的实例化)类型.getClass()、Class.forName("类名")等方法获取class对象
//类名.class
Class cla = 类名.class;
Class cla1 = int.class;//基本类型只有这一种获取类对象的方式
//类型.getClass
Person p = new Person();
Class cls = p.getClass;
//Class.forName(String className)
Class cls = Class.forName(java.lang.String);
//在括号中填写的是类的完全限定名,包名加类名
获取类对象的完全限定名 getName();获取类名 getSimpleName();获取包 getPackage();
Class cls = Class.forName("java.lang.String");
String name = cls.getName();//java.lang.String
name = cls.getSimpleName();//String
/*
获取当前类对象所表示的类的包,返回一个Package类型的实例来表示包的信息
*/
Package pack = cls.getPackage();
String packname = pack.getName;//java.lang
获取类中的方法 getMethods(); 返回的是一个Method[]数组
Method[] methods = cls.getMethods();
for(Method method : methods){
System.out.println(method.getName);//获取类中方法的名字
}
通过反射实例化对象
Scanner scan = new Scanner(System.in);
System.out.println("输入要实例化的类名");
String className = scan.nextLine();
Class cls = Class.forName(className);
//类对象提供了一个可以通过公开的,无参的构造器实例化的方法
Object obj = cls.newInstance();
System.out.println(obj);
使用有参构造实例化
//例如:Person(String,int);
Class cls = Class.forName(Person类的完全限定名);
//获取Person的构造器,若其中不传任何参数,则获得的还是无参构造
Constructor c = cls.getConstructor(String.class,int.class);
Object obj = c.newInstance("王五",55);//实例化时需要传参,等同于 new Person("王五",55)
使用反射机制调用方法
Class cls = Class.forname(完全限定名);
Object obj = cls.newInstance();
Method method = cls.getMethod(方法名字);
//通过方法对象调用方法
method.invoke(obj);