反射机制中的Class

    Class内部到底有什么呢?看下图!

代码:
  Class cls=Person.class;
1、Class类:
1、 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含可特定的某个类的有关信息。 2、Class对象只能由系统建立对象。 3、一个类在JVM中只会有一个Class实例。 4、每个类的实例都会记得自己是由哪个Class实例产生的。 5、Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类! 2、得到Class对象【三种方法】 1、直接通过: 类名.class Class cls=Person.class; 2、getClass()方式 Object obj=new Person();
Class cls2=obj.getClass(); 3、Class.forName("包名.类名")【最常用】【框架使用的最多】
try {
Class cls3=Class.forName("cn.sgg.reflections.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
3、反射中的泛型
举例:
Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person"); Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person"); //?表示任意对象类型 4、Class类中的方法 1、创建类的实例的方法:newInstance() Class cls3=Class.forName("cn.sgg.reflections.Person"); Object obj=cls3.newInstance();//得到实例(通过:无参构造器) Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器) 说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!) 2、Field<------>classType.getDeclaredFields(); 3、Method<----->getDeclaredMethod(getMethodName, new Class[]{}); 4、Constructor<------>getConstructor(new Class[]{int.class,String.class}); 5、反射的在哪里被使用? 框架中:
      Servlet、Strust2等基础框架中...... 6、类加载器:ClassLoader 说明:
ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。 启动类装载器(bootstap) 用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构, 如下图: BootStrap(启动类加载器) :负责加载 jdk.../jre/lib/xxx.jar (例如:rt.jar)或者被 -Xbootclasspath参数指定的路径的jar
extension classloader(扩展类加载器) 加载 jdk.../jre/lib/ext/xxx.jar 或者 java.ext.dirs指定的路径的类库
system(application) classloader(应用程序加载器或者系统类加载器): 负责加载用户类路径(ClassPath)上指定的类库。

例如查看javac的帮助信息:

C:\Users\liqiang\Desktop>javac
用法: javac <options> <source files>
其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认
-processorpath <路径> 指定查找注释处理程序的位置
-d <目录> 指定放置生成的类文件的位置
-s <目录> 指定放置生成的源文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-version 版本信息
-help 输出标准选项的提要
-A关键字[=值] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标记> 直接将 <标记> 传递给运行时系统
-Werror 出现警告时终止编译
@<文件名> 从文件读取选项和文件名
    举例:
1、//获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println(classLoader); 2、//获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println("系统加载器:"+classLoader); 3、//获取系统类加载器的父类的加载器
ClassLoader parentLoader=classLoader.getParent();
System.out.println("系统加载器的父类加载器:"+classLoader); 4、//获取扩展类加载器的父类加载器
classLoader=parentLoader.getParent();
System.out.println("扩展类加载器的父类加载器:"+classLoader); 5、//检测当前类是由哪个类加载器加载的
try {
ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
System.out.println(classLoader2); } catch (ClassNotFoundException e) {
e.printStackTrace();
} 6、//检测JDK 提供的Object类由哪个类加载器负责加载的
ClassLoader classLoader3;
try {
classLoader3 = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} 7、关于类加载器的一个重要方法: 系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀 举例:
//关于类加载器的一个重要方法:
InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");

测试代码:

package cn.sgg.reflections;

/**
* 反射--被测试类:
*/
public class Person {
String name;
private int age; public Person(){}
public Person(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package cn.sgg.reflections;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field; /**
* 反射-测试类:
*
*/
public class TestReflect { public static void main(String[] args) {
new TestReflect().testClassLoader();
} /**
* 测试反射的方法
*/
static void getProperty(){ //1、得到Class对象
Class cls=Person.class; Field[] fields=cls.getDeclaredFields();
//2、得到Class对象
Object obj=new Person();
Class cls2=obj.getClass();
//3、得到Class对象
try {
Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person"); //获得类实例
Object obj1=cls3.newInstance(); } catch (Exception e) {
e.printStackTrace();
}
} static void testClassLoader(){ //获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println("系统加载器:"+classLoader); //获取系统类加载器的父类的加载器
ClassLoader parentLoader=classLoader.getParent();
System.out.println("系统加载器的父类加载器:"+classLoader); //获取扩展类加载器的父类加载器
classLoader=parentLoader.getParent();
System.out.println("扩展类加载器的父类加载器:"+classLoader); //检测当前类是由哪个类加载器加载的
try {
ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
System.out.println(classLoader2); } catch (ClassNotFoundException e) {
e.printStackTrace();
} //检测JDK 提供的Object类由哪个类加载器负责加载的
ClassLoader classLoader3;
try {
classLoader3 = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader3);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} //关于类加载器的一个重要方法:
InputStream in=null;
in=TestReflect.class.getResourceAsStream("xxxx.txt");
}
}
系统加载器:sun.misc.Launcher$AppClassLoader@18d107f
系统加载器的父类加载器:sun.misc.Launcher$AppClassLoader@18d107f
扩展类加载器的父类加载器:null
sun.misc.Launcher$AppClassLoader@18d107f
null
得到图片的刘对象:null

Class类和ClassLoader类的简单介绍的更多相关文章

  1. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  2. 分析Class类和ClassLoader类下的同名方法getResourceAsStream

    在读取本地资源的时候我们经常需要用到输入流,典型的场景就是使用Druid连接池时读取连接池的配置文件.Java为我们提供了读取资源的方法getResourceAsStream(),该方法有三种: Cl ...

  3. 反射(学习整理)----Class类和加载器ClassLoader类的整理

    1.学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍 反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; .C ...

  4. 实例级别和类级别的static、构造函数、字段属性的简单介绍

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实例级别 ...

  5. oc-12-NSString 类简单介绍及用法

    // 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...

  6. InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

    InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是 ...

  7. 第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下

    首先先对这段代码的简单介绍,我之前在需要操作JDBC的时候总是会因为经常要重新写SQL语句感到很麻烦.所以就能拿则拿不能拿的就简单地封装了一下. 首先是Insert.Spring框架的JDBC包里面的 ...

  8. Tstrings类简单介绍及实例

    用TStrings保存文件;var  S: TStrings;begin  S := TStringList.Create();  { ... }  S.SaveToFile('config.txt' ...

  9. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

随机推荐

  1. zookeeper学习之集群环境搭建

    一.安装环境 zookeeper:3.4.6 JDK:1.8 linux:centos6.5  64位 主机: server0:192.168.0.224server1:192.168.0.225se ...

  2. iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转

    iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转 1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJs ...

  3. Java 读取Excel2007 jar包冲突的问题(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)

    1.jar包冲突报错问题 2.使用的jar包,以及重复jar包 3.删除重复jar包

  4. 自动化测试断言Assent的使用

    Assent 断言模板包含如下方法: assert.fail(actual, expected, message, operator) assert.ok(value, [message]) asse ...

  5. ans menu list

    ans menu list 1. 系统配置 a) 基本设置 i. NTP ii. 配置模式 iii. 主机信息 b) 高可用性 i. 节点 ii. 路由监视器 iii. 故障转移接口群 c) 设备标识 ...

  6. 【刷题】HDU 4966 GGS-DDU

    Problem Description Do you think this is a strange problem name? That is because you don't know its ...

  7. 【ZOJ3316】Game(带花树)

    [ZOJ3316]Game(带花树) 题面 Vjudge 翻译: 给定棋盘上\(n\)个旗子 一开始先手可以随便拿, 然后每次都不能取离上次的曼哈顿距离超过\(L\)的旗子 谁不能动谁输. 问后手能否 ...

  8. 简单的并发服务器(多个线程各自accept)

    基于之前讲述的简单循环服务器,做一个多个线程各自accept的服务器demo 由于多个线程各自accept,容易造成数据错误,需要在accept前后枷锁 先看下客户端 客户端创建socket,初始化服 ...

  9. socket编程 ------ sockaddr_in 和 sockaddr 的区别

    struct sockaddr 和 struct sockaddr_in 这两个结构体用来处理网络通信的地址. // 以下是 IPv4 的定义 struct sockaddr { unsigned s ...

  10. Highcharts.js -纯javasctipt图表库初体验

    一.highcharts简介以及引入 highcharts作为免费提供给个人学习.个人网站和非商业用途使用的前端图表演示插件的确使用起来十分方便和轻便.在我最近完成一个需求的时候用到了它, 它的兼容性 ...