小知识:
class和Class:class是定义一个类的标示符,Class代表一类什么样的事物,用来表示多个类是否表示同一类的事物,是用来描述类的(比如所有的类都有类的名字,所属那个包等特性)。
Class
类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class
对象。基本的 Java 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 void
也表示为 Class
对象。
Class
没有公共构造方法。Class
对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass
方法自动构造的。
以下示例使用 Class
对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
1:关于字节码:
(一):获得某个类的字节码的方式:
常用的有三种 a:类名.Class
b:某个类的对象.getClass();如:new Data().getClass()
c:Class.forName(“类名”)
publicclass Number
{
publicstaticvoid main(String[] args)
{
Class clse = String.class;
System.out.println(clse);
System.out.println(String.class);
Date dd = new Date();
System.out.println(dd.getClass());
try {
System.out.println(Class.forName("java.lang.String"));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打印出的结果为:
classjava.lang.String
classjava.lang.String
classjava.util.Date
class java.lang.String
反射:就是吧java中的各种成分映射成相应的java类.
构造方法的反射:
Constructor 类的使用,
Constructor cont = Class.forName(“java.lang.String”).getConstructors(String.class).
Class.forName(“java.lang.String”);是获得String这个类的字节码,调用getconstructors方法,构造一个cont对象,这个对象指向String这个类的字节码,String.class是选取构造方法中的哪一个。
反射就一个类,类中有类,类的成分的类。
访问私用的字段:
Field fd = 对象.getCalss.getField(“x(字段)”);
如果字段x的修饰符是private 则编译是会出现错误,这是因为x是私有的。用
Fieldfd = 对象.getCalss.getDeclaredField(“x(字段)”);就OK了,
打印的时候也不能和默认的和public修饰的字段一样来打印,要在打印之前,fd.setAccessible(true)一下,就是暴力反射,这样在打印就可以了。