java 反射相关知识

一 、Class 类

1、Class类的由来

    Java语言是面向对象的编程语言。在java中万事万物皆是对象,除了基本数据类型,和静态的方法和属性(因为它们是属于类的)没有面向对象的痕迹。

类是模板,它把对象的特征和行为抽象后进行封装。例如学生是对象,它有哪些特征(属性):姓名,年龄,班级。行为:学习等。因此就有了类

 public class Student {
    private String name;
    private int age;
    private String className;

    getter and setter mothod;

    public void study() {...}
}

刚说过在java中万事万物皆对象,那么类也不例外类也是对象。它也有自己的特征(属性):它有方法,构造器,属性。行为:构造对象,方法调用。我们现在需要一个类把它的行为和属性抽象后加以封装—Class类诞生了。

2、创建类的实例

(1)创建普通类的实例:通过new关键字。

Student stu = new Student(); 

(2) 创建Class类的实例:
方法一:隐含的静态成员变量class

Class c1 = Student.class;

方法二:该类对象的getClass方法

Class c2 = stu.getClass();

方法三:Class类的静态方法forName(String className)

Class c3 = Class.forName("Student") // 如果类在包中这里的className要写完全限定类名

其中,c1,c2,c3是同一个对象,即c1==c2==c3。很容易理解。一个类只需要一个描述他的Class对象。其中stu称为Student类的实例,c1,c2,c3称为Student类的类类型。
三、类的静态加载和动态加载
类的静态加载:在编译时期把需要的类的字节码加载进来。在java代码中的体现:
new Student();
类的动态加载:在运行时期把需要的类的字节码加载进来。在java代码中的体现:Class.forName(“完全限定类名”) (完全限定类名=包名+类名)

平时我们用IDE,有些编译错误的检查直接帮我们做了。为了更深刻的体会静态和动态加载。我们选用命令方式编译和运行。

位置:C:\Users\gzn\Desktop\TestLoader\
class  TestStaticLoader
{
    public static void main(String[] args) 
    {
        List list = new ArrayList();
    }
}

这里写图片描述
在虚拟机编译时,发现有new ArrayList();此时要进行静态加载。此时它会在我的import 中寻找有没有ArrayList这个类。没有,接着在此java源文件TestStaticLoader的同目录下看有没有ArrayList这个类,也没有报错。

正确做法:
import java.util.List
import java.util.ArrayList
class  TestStaticLoader
{
    public static void main(String[] args) 
    {
        List list = new ArrayList();
    }
}

猜你喜欢

转载自blog.csdn.net/gao_zhennan/article/details/80276600