什么叫反射?Java程序可以动态地获取某个对象、某个类的运行时信息,并可以动态地创建Java对象,动态地调用Java方法,访问并修改指定对象的成员变量值。
JVM和类?开启一个程序,就启动了一个JVM进程,不同的JVM进程之间是不能共享资源。
类初始化:加载、连接、初始化三个步骤来对该类进行初始化三个步骤来对该类进行初始化。
类的加载:将类的class文件读入内存。
类的连接:把类的二进制数据合并到JRE中
类的初始化:1 声明类变量时指定初始值 2 使用静态初始化块为类变量指定初始值。
类加载器:类的唯一标识:全限定类名(包括包名和类名)
Java运行时会出现两种类型:编译时类型和运行时类型。
Person p=new Student();
在这种情况下,p变量在编译的时候是Person类型,在运行时是Student类型,如果需要解决这种做法
1 在编译时和运行时发现对象类型和类的真实信息
2 无法知道真实信息,程序只能依靠运行时信息来发现该对象和类的真实信息,此时需要用到反射知识。
如果想获得Class对象的信息:总共有三种方法
1 Class.forName("包名+类名")
package Collection;
public class ArgsTest {
//public static void main
// public :main程序需要被JVM调用,需要被JVM自由调用这个main()方法,所以使用public 修饰符把这个方法暴露出来
//static: 调用主方法的时候 ,JVM不可能先创建该主类的对象,然后通过该对象来调用该主方法,JVM直接通过该类来调用主方法
//void:返回值,因为主方法被JVM调用,该方法返回值给JVM,此处没有任何意义
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(args.length);
for(String s: args)
{
System.out.println(s);
}
System.out.println(Class.forName("Collection.ArrayExpression"));
System.out.println(Class.forName("Collection.Ast"));
/*
* 0
class Collection.ArrayExpression
interface Collection.Ast
*/
}
}
找不到该就会抛出ClassNotFoundException。
2 调用对象的getClass()方法
public static void main(String[] args) throws ClassNotFoundException {
String s1="dsfafdsa";
System.out.println(s1.getClass());
3 调用调用某个类的.class属性
public static void main(String[] args) throws ClassNotFoundException {
String s1="dsfafdsa";
System.out.println(ArrayListTest.class);