什么是反射?
反射是java的动态机制,可以允许我们在程序[运行期间]再确定实例化
什么是类对象?
JVM在加载一个类的class文件时,就会同时创建一个Class的实例,使用该实例记录加载的类的一切信息.反射的第一步就是获取要操作的类的类对象,以便程序在运行期间得知要操作的类的一切信息然后对其进行响应的操作。
创建类对象的三种方式
1:类名.class
2.Class.forName("类的完全限定名")
3.通过类加载器的形式完成
通过类对象可以获取的信息有:
1.获取类的完全限定名 getName()
2.获取简单类名 getSimpleName()
3.获取当前类对象所表示的类的包,返回Package实例表示该包的信息 Package getPackage()
4.获取所有公开方法,包括超类继承的 getMethods 返回一个Mthod[]
5.获取单独的方法,getMethod("方法名") 返回一个Method类型,通过Method类型的实例调用invoke(object类型的实例).相当于调用方法
-----5.1 获取重载的方法 getMethod("方法名",参数类型.class........)
6.通过类对象可以直接用公开的无参构造器实例化的方法 newInstance() 返回一个Object对象实际上表示的是该类的对象
7.通过类对象可以获取有参构造器, getConstructor(参数类型的.class) 返回一个Constructor类型
再通过Constructor类型的实例进行newInstance
8.通过类对象获取所表示的类的自身定义的所有方法,包括私有方法
getDeclaredMethod()和getDeclaredMethods(),当想要获取一个私有方法时,用过方法对象.setAccessible(true)就会强行打开方法的访问权限
两个常用抽象路径
当前目录表示的是此类所属的包的最外层包的上一级目录
类名.class.getClassLoader.getResource(".").toURI();
当前目录表示此类所属的目录
类名.class.getResource(".").toURI();
方法的变长参数 规定:一个方法里只能有一个方法的变长参数,并且必须放在最后一位
public class ArgDemo {
public static void main(String[] args) {
dosome(1,"one");
dosome(2,"one","two");
dosome(1,"one","two","three");
}
/**
* 一个方法里只能有一个变长参数,且必须是最后一个参数
*/
public static void dosome(int a,String... arg){
System.out.println(arg.length);
System.out.println(Arrays.toString(arg));
}
}