다음과 같은 측면에 초점을 맞추고 (자바의 클래스 로딩 메커니즘을 이해하는 클래스 수준의 이해, 클래스로드를 실시 클래스 로더를 사용하는 방법을 배우게)
클래스 클래스를 이해 (1)
각 클래스의 경우, JRE는 대한 일정한 유형의 Class 객체를 유지합니다. 클래스 객체는 특정 클래스에 대한 정보가 포함되어 있습니다.
JVM의 클래스는 클래스의 인스턴스가 될 것입니다
클래스의 각 인스턴스는 클래스의 인스턴스에 의해 생성된다 기억되는
1 : 어떤 종류인가?
공공 클래스 ReflectionTest { @Test 공공 무효 의 TestClass () {클래스 clazz에 = 널 (null) ; }} // 클래스的定义공공 최종 클래스 클래스 <T> 를 구현 java.io.Serializable을, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement {....}
2 : 어떤 정보 클래스이 클래스 캡슐화?
클래스 현재 개체 클래스에 해당하는 정보를 캡슐화하는 클래스
, 클래스가 예를 들어 속성, 메서드 및 다른 구성을 가지고, Person 클래스, 주문 클래스, 클래스 도서, 서로 다른 클래스는 (1) 지금 우리가 클래스 인 클래스를 설명하는 데 사용하는 클래스를 필요는 같은 클래스 이름, 특성, 방법, 구조 또는이 있어야합니다. 클래스 클래스는 클래스를 설명하는 데 사용되는
2 급 클래스 오브젝트의 거울의 결과, 대상이되는 등 어떤 구현들은 속성에있어서, 생성자, 인터페이스를 볼 수있다
관련 카테고리별로 3. JRE를위한 일정한 종류의 클래스 오브젝트를 유지한다. 클래스 객체는 특정 클래스에 대한 정보가 포함되어 있습니다.
4.Class 객체 만 시스템 개체에 의해 설립 될 수 있고, JVM의 클래스 (아닌 개체) 클래스의 인스턴스 것
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
패키지 반영;
공용 클래스 사람 {
문자열 이름;
개인 INT의 시대;
공공 문자열 getName () {
반환 이름;
}
공공 무효 에서는 setName (문자열 이름) {
이 .name을 = 이름;
}
공공 INT getAge () {
반환 시대;
}
공공 무효 setAge ( INT의 연령) {
이 .age = 나이;
}
공공 사람 (문자열 이름, INT 세) {
슈퍼 ();
이 .name을 = 이름;
이 .age = 나이;
}
공공 사람 () {
슈퍼 ();
}
}
클래스 클래스 객체 클래스를 돌려
공용 클래스 ReflectionTest {
@Test
공개 공극 의 TestClass () {
클래스를 clazz = 널 ;
// 1 클래스 개체 수득
를 clazz = 사람. 클래스 ]
에서 System.out.println (); // 중단 삽입
}
}
중단 점에서, 당신은 클래스에 포함 된 이미지 정보를 볼 수 있습니다
마찬가지로, 이러한 특성의 값을 얻을 수있다
public class ReflectionTest {
@Test
public void testClass() {
Class clazz = null;
//1.得到Class对象
clazz = Person.class;
//2.返回字段的数组
Field[] fields = clazz.getDeclaredFields();
System.out.println(); //插入断点
}
}
查看fields的内容
对象为什么需要照镜子呢?
1. 有可能这个对象是别人传过来的
2. 有可能没有对象,只有一个全类名
通过反射,可以得到这个类里面的信息
获取Class对象的三种方式
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
public class ReflectionTest {
@Test
public void testClass() throws ClassNotFoundException{
Class clazz=null;
//1、通过类名获取对象 类名.class
clazz=Person.class;
Field[] filed=clazz.getDeclaredFields();
Field[] fields=clazz.getFields();
System.out.println(Arrays.deepToString(filed));
System.out.println(Arrays.deepToString(fields));
//2、通过对象名
//这种方式是用在传进来一个对象,却不知道对象的类型时候用
Person person=new Person();
clazz=person.getClass();
Object obj=new Person();
clazz=obj.getClass();
//3、通过全类名(会抛出异常)
String classname="reflect.Person";
clazz=Class.forName(classname);
//字符串的例子
clazz=String.class;
clazz="javaTest".getClass();
clazz=Class.forName("java.lang.String");
System.out.println();
}
Class类的常用方法
方法名 |
功能说明 |
static Class forName(String name) |
返回指定类名 name 的 Class 对象 |
Object newInstance() |
调用缺省构造函数,返回该Class对象的一个实例 |
Object newInstance(Object []args) |
调用当前格式构造函数,返回该Class对象的一个实例 |
getName() |
返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称 |
Class getSuperClass() |
返回当前Class对象的父类的Class对象 |
Class [] getInterfaces() |
获取当前Class对象的接口 |
ClassLoader getClassLoader() |
返回该类的类加载器 |
Class getSuperclass() |
返回表示此Class所表示的实体的超类的Class |
Class类的newInstance()方法