java基础知识-反射机制

//Java中的反射机制(Reflection):可以加载一个运行时才得知名称的class,
//获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、
//或调用其methods。


// Java反射相关的API,都位于java.lang.reflect包中:
// Class类:代表一个类
// Filed类:代表类的成员变量
// Method类:代表类的方法
// Constructor类:代表类的构造方法
// Array类:提供了动态创建数组,及访问数组的元素的静态方法

// 反射调用一般分为四个步骤:
// 1、得到调用类的Class
// 2、运行时生成此类的对象
// 3、得到调用的类中的方法和属性(Method,Fields)
// 4、方法调用invoke


// Class类用于表达Java程序运行时class和interface,也可以表达enum,array等。
// 当加载器的defineClass被JVM调用时,便会产生一个Class对象。
// Class是Refection的起源,针对任何你想使用的class(类),
// 唯有先产生一个Class的对象,然后才可以调用其他反射API。

// 通过得到Class类的实例后,想要生成对象,在反射动态机制中常用的有两种方法:
// 调用不带参数的构造方法有两种方式:
//第一种,通过Class对象的newInstance方法,调用默认构造方法
// Class classType = Type.class;
// Object inst = classType.newInstance();
//第二种,调用默认Constructor对象的newInstance方法
// Class classType = Type.class;
// Constructor constructor1 = classType.getConstructor();
// Object inst = constructor1.newInstance();
// 调用带参数的构造方法
//调用带参数Constructor对象的newInstance方法,需要参数类型
// Constructor constructor2 =
//         classType.getDeclaredConstructor(int.class,
// String.class);
// Object inst = constructor2.newInstance(1, "123");

/**
* Object类是所有Java类的祖先。每个类都使用 Object 作为超类。
* 所有对象(包括数组)都实现这个类的方法。
* 在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
* 可以使用类型为Object的变量指向任意类型的对象。
*/
/**
* Object类有一个默认构造方法 pubilc Object(),在构造子类实例时,
* 都会先调用这个默认构造方法。
* Object类的变量只能用作各种值的通用持有者。要对他们进行任何专门的操作,
* 都需要知道它们的原始类型并进行类型转换。
*/

// Object  obj = new  MyObject();
// MyObject  x = (MyObject) obj; 
//方法预览
/**
Object()
默认构造方法。
clone() 
创建并返回此对象的一个副本。 
equals(Object obj) 
指示某个其他对象是否与此对象“相等”。 
finalize() 
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 
getClass() 
返回一个对象的运行时类。
hashCode() 
返回该对象的哈希码值。
notify() 
唤醒在此对象监视器上等待的单个线程。
notifyAll() 
唤醒在此对象监视器上等待的所有线程。 
toString() 
返回该对象的字符串表示。 
wait() 
导致当前的线程等待,直到其他线程调用此对象的 notify()方法
或 notifyAll()方法。
wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()
方法,或者超过指定的时间量。
wait(long timeout, int nanos) 
导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()
方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量
*/

/*
* equals()方法:用于测试某个对象是否同另一个对象相等。
* 它在Object类中的实现是判断两个对象是否指向同一块内存区域。
* 这种测试用处不大,因为即使内容相同的对象,内存区域也是不同的。
* 如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。
*/
/*
* Java语言规范要求equals方法具有下面的特点:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x)
返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,
并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 
或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
*/

/**
* public int hashCode() 返回该对象的哈希码值。
hashCode的常规协定是: 
1.在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,
必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。
2.如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的
每个对象上调用 hashCode 方法都必须生成相同的整数结果
*/
/*
* public String toString() 返回该对象的字符串表示。
1.通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。
建议所有子类都重写此方法。 
2.Object 类的 toString 方法返回一个字符串,该字符串由类名
(对象是该类的一个实例)、at标记符“@”和此对象哈希码的无符号十六进制表示组成。
3.该方法返回一个字符串,它的值等于: 
getClass().getName() + '@' + 
Integer.toHexString(hashCode()) 
*/

你可能感兴趣的:(java基础知识-反射机制)