System.out.println(m.invoke(iter));
}
}
import java.util.*;
import java.lang.reflect.*;
public class PuzzleDemo78{
public static void main(String args[])throws Exception{
Set
s.add("foo");
Iterator iter = s.iterator();
Method m = Iterator.class.getMethod("hasNext");
System.out.println(m.invoke(iter));
}
}
4.编译器寻找调用方法的规则:在正确的名称方法的最内层作用域查找需要调用的方法。
5.Class.newInstance和内部类
Class.newInstance()是调用一个空的构造器。
而非静态内部类调用空构造器时,会有一个隐藏的一个参数即外部类实例,因此外表看起来是空的内部类构造器并不是空构造器。
结论:避免使用反射实例化内部类。
view plaincopy to clipboardprint import java.lang.reflect.*;
public class PuzzleDemo80{
public static void main(String args[])throws Exception{
new PuzzleDemo80().greetWorld();
}
private void greetWorld()throws Exception{
Constructor c = Inner.class.getConstructor(PuzzleDemo80.class);
System.out.println(c.newInstance(PuzzleDemo80.this));
}
public class Inner{
public Inner(){}
public String toString(){
return "Hellow";
}
}
}
import java.lang.reflect.*;
public class PuzzleDemo80{
public static void main(String args[])throws Exception{
new PuzzleDemo80().greetWorld();
}
private void greetWorld()throws Exception{
Constructor c = Inner.class.getConstructor(PuzzleDemo80.class);
System.out.println(c.newInstance(PuzzleDemo80.this));
}
public class Inner{
public Inner(){}
public String toString(){
return "Hellow";
}
}
}
6.System.out的一个瑕疵
System.out是一个PrintStream,因此带有缓冲区,但是可以自动刷新。
但是有一个方法例外!
write(int)是唯一一个在自动刷新功能开启的情况下不刷新PrintStream输出流的方法。
view plaincopy to clipboardprint public class PuzzleDemo81{
public static void main(String args[]){
String greeting = "Hello ";
for(int i=0;i
}
}
}
public class PuzzleDemo81{
public static void main(String args[]){
String greeting = "Hello ";
for(int i=0;i
}
}
}
7.复制对象的简单方法及解决
实现了io.serializable的类可以简单的通过writeObject和readObject复制对象,并生成一个新的对象。
如果一个类是Singleton,因此只能有一个对象,怎么能够解决这个问题使得通过writeObject和readObject后的对象还是其本身呢?
private Object readResolve(){
return **;
}
view plaincopy to clipboardprint import java.io.*;
class Dog extends Exception{
public static final Dog INSTANCE = new Dog();
private Dog(){}
public String toString(){
return "woof";
}
private Object readResolve(){ //实现readResolve方法,使得只有一个实例
return INSTANCE;
}
}
public class PuzzleDemo83{
public static void main(String args[])throws Exception{
Dog dog = Dog.INSTANCE;
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
out.writeObject(dog);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));
Dog dog2 = (Dog)in.readObject();
in.close();
System.out.println(dog==dog2);
}
}
import java.io.*;
class Dog extends Exception{
public static final Dog INSTANCE = new Dog();
private Dog(){}
public String toString(){
return "woof";
}
private Object readResolve(){ //实现readResolve方法,使得只有一个实例
return INSTANCE;
}
}
public class PuzzleDemo83{
public static void main(Str