//: typeinfo/toys/ToyTest.java// Testing class Class.packagetypeinfo.toys;import staticnet.mindview.util.Print.*;interfaceHasBatteries{}interfaceWaterproof{}interfaceShoots{}classToy{// Comment out the following default constructor// to see NoSuchMethodError from (*1*)Toy(){}Toy(inti){}}classFancyToyextendsToyimplementsHasBatteries,Waterproof,Shoots{FancyToy(){super(1);}}publicclassToyTest{staticvoidprintInfo(Classcc){print("Class name: "+cc.getName()+" is interface? ["+cc.isInterface()+"]");print("Simple name: "+cc.getSimpleName());print("Canonical name : "+cc.getCanonicalName());}publicstaticvoidmain(String[]args){Classc=null;try{c=Class.forName("typeinfo.toys.FancyToy");}catch(ClassNotFoundExceptione){print("Can't find FancyToy");System.exit(1);}printInfo(c);for(Classface:c.getInterfaces())printInfo(face);Classup=c.getSuperclass();Objectobj=null;try{// Requires default constructor:obj=up.newInstance();}catch(InstantiationExceptione){print("Cannot instantiate");System.exit(1);}catch(IllegalAccessExceptione){print("Cannot access");System.exit(1);}printInfo(obj.getClass());}}/* Output:Class name: typeinfo.toys.FancyToy is interface? [false]Simple name: FancyToyCanonical name : typeinfo.toys.FancyToyClass name: typeinfo.toys.HasBatteries is interface? [true]Simple name: HasBatteriesCanonical name : typeinfo.toys.HasBatteriesClass name: typeinfo.toys.Waterproof is interface? [true]Simple name: WaterproofCanonical name : typeinfo.toys.WaterproofClass name: typeinfo.toys.Shoots is interface? [true]Simple name: ShootsCanonical name : typeinfo.toys.ShootsClass name: typeinfo.toys.Toy is interface? [false]Simple name: ToyCanonical name : typeinfo.toys.Toy*///:~
//: typeinfo/BoundedClassReferences.javapublicclassBoundedClassReferences{publicstaticvoidmain(String[]args){Class<?extendsNumber>bounded=int.class;bounded=double.class;bounded=Number.class;// Or anything else derived from Number.}}///:~
//: typeinfo/ClassCasts.javaclassBuilding{}classHouseextendsBuilding{}publicclassClassCasts{publicstaticvoidmain(String[]args){Buildingb=newHouse();Class<House>houseType=House.class;Househ=houseType.cast(b);h=(House)b;// ... or just do this.}}///:~
publicclassIndividualimplementsComparable<Individual>{privatestaticlongcounter=0;privatefinallongid=counter++;privateStringname;publicIndividual(Stringname){this.name=name;}// 'name' is optional:publicIndividual(){}publicStringtoString(){returngetClass().getSimpleName()+(name==null?"":" "+name);}publiclongid(){returnid;}publicbooleanequals(Objecto){returnoinstanceofIndividual&&id==((Individual)o).id;}publicinthashCode(){intresult=17;if(name!=null)result=37*result+name.hashCode();result=37*result+(int)id;returnresult;}publicintcompareTo(Individualarg){// Compare by class name first:Stringfirst=getClass().getSimpleName();StringargFirst=arg.getClass().getSimpleName();intfirstCompare=first.compareTo(argFirst);if(firstCompare!=0)returnfirstCompare;if(name!=null&&arg.name!=null){intsecondCompare=name.compareTo(arg.name);if(secondCompare!=0)returnsecondCompare;}return(arg.id<id?-1:(arg.id==id?0:1));}}publicclassPetextendsIndividual{publicPet(Stringname){super(name);}publicPet(){super();}}//🐱publicclassCatextendsPet{publicCat(Stringname){super(name);}publicCat(){super();}}//🐶publicclassDogextendsPet{publicDog(Stringname){super(name);}publicDog(){super();}}//鼠类publicclassRodentextendsPet{publicRodent(Stringname){super(name);}publicRodent(){super();}}//马恩岛🐱publicclassManxextendsCat{publicManx(Stringname){super(name);}publicManx(){super();}}//埃及🐱publicclassEgyptianMauextendsCat{publicEgyptianMau(Stringname){super(name);}publicEgyptianMau(){super();}}//威尔士🐱publicclassCymricextendsManx{publicCymric(Stringname){super(name);}publicCymric(){super();}}//混血🐶publicclassMuttextendsDog{publicMutt(Stringname){super(name);}publicMutt(){super();}}//哈巴🐶publicclassPugextendsDog{publicPug(Stringname){super(name);}publicPug(){super();}}//大🐭publicclassRatextendsRodent{publicRat(Stringname){super(name);}publicRat(){super();}}//仓鼠publicclassHamsterextendsRodent{publicHamster(Stringname){super(name);}publicHamster(){super();}}//小🐭publicclassMouseextendsRodent{publicMouse(Stringname){super(name);}publicMouse(){super();}}
//: typeinfo/pets/PetCreator.java// Creates random sequences of Pets.packagetypeinfo.pets;importjava.util.*;publicabstractclassPetCreator{privateRandomrand=newRandom(47);// The List of the different types of Pet to create:publicabstractList<Class<?extendsPet>>types();publicPetrandomPet(){// Create one random Petintn=rand.nextInt(types().size());try{returntypes().get(n).newInstance();}catch(InstantiationExceptione){thrownewRuntimeException(e);}catch(IllegalAccessExceptione){thrownewRuntimeException(e);}}publicPet[]createArray(intsize){Pet[]result=newPet[size];for(inti=0;i<size;i++)result[i]=randomPet();returnresult;}publicArrayList<Pet>arrayList(intsize){ArrayList<Pet>result=newArrayList<Pet>();Collections.addAll(result,createArray(size));returnresult;}}///:~
publicclassForNameCreatorextendsPetCreator{privatestaticList<Class<?extendsPet>>types=newArrayList<Class<?extendsPet>>();// Types that you want to be randomly created:privatestaticString[]typeNames={"typeinfo.pets.Mutt","typeinfo.pets.Pug","typeinfo.pets.EgyptianMau","typeinfo.pets.Manx","typeinfo.pets.Cymric","typeinfo.pets.Rat","typeinfo.pets.Mouse","typeinfo.pets.Hamster"};@SuppressWarnings("unchecked")privatestaticvoidloader(){try{for(Stringname:typeNames)types.add((Class<?extendsPet>)Class.forName(name));}catch(ClassNotFoundExceptione){thrownewRuntimeException(e);}}static{loader();}publicList<Class<?extendsPet>>types(){returntypes;}}///:~
publicclassLiteralPetCreatorextendsPetCreator{// No try block needed.@SuppressWarnings("unchecked")publicstaticfinalList<Class<?extendsPet>>allTypes=Collections.unmodifiableList(Arrays.asList(Pet.class,Dog.class,Cat.class,Rodent.class,Mutt.class,Pug.class,EgyptianMau.class,Manx.class,Cymric.class,Rat.class,Mouse.class,Hamster.class));// Types for random creation:privatestaticfinalList<Class<?extendsPet>>types=allTypes.subList(allTypes.indexOf(Mutt.class),allTypes.size());publicList<Class<?extendsPet>>types(){returntypes;}publicstaticvoidmain(String[]args){System.out.println(types);}}/* Output:[class typeinfo.pets.Mutt, class typeinfo.pets.Pug, class typeinfo.pets.EgyptianMau, class typeinfo.pets.Manx, class typeinfo.pets.Cymric, class typeinfo.pets.Rat, class typeinfo.pets.Mouse, class typeinfo.pets.Hamster]*///:~
//: typeinfo/PetCount2.javaimporttypeinfo.pets.*;publicclassPetCount2{publicstaticvoidmain(String[]args){PetCount.countPets(Pets.creator);}}/* (Execute to see output) *///:~
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter. It returns true if so;otherwise it returns false.If this Class object represents a primitive type,this method returns true if the specified Class parameter is exactly this Class object; otherwise it returns false. 确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是否为超类或超接口。如果是,则返回true;否则返回false。如果此Class对象表示一个基本类型,如果指定的Class参数恰好是此Class对象则此方法返回true;否则返回false。
//: net/mindview/util/TypeCounter.java// Counts instances of a type family.packagenet.mindview.util;importjava.util.*;publicclassTypeCounterextendsHashMap<Class<?>,Integer>{privateClass<?>baseType;publicTypeCounter(Class<?>baseType){this.baseType=baseType;}publicvoidcount(Objectobj){Class<?>type=obj.getClass();if(!baseType.isAssignableFrom(type))thrownewRuntimeException(obj+" incorrect type: "+type+", should be type or subtype of "+baseType);countClass(type);}privatevoidcountClass(Class<?>type){Integerquantity=get(type);put(type,quantity==null?1:quantity+1);Class<?>superClass=type.getSuperclass();if(superClass!=null&&baseType.isAssignableFrom(superClass))countClass(superClass);}publicStringtoString(){StringBuilderresult=newStringBuilder("{");for(Map.Entry<Class<?>,Integer>pair:entrySet()){result.append(pair.getKey().getSimpleName());result.append("=");result.append(pair.getValue());result.append(", ");}result.delete(result.length()-2,result.length());result.append("}");returnresult.toString();}}///:~
//: typeinfo/RegisteredFactories.java// Registering Class Factories in the base class.importtypeinfo.factory.*;importjava.util.*;classPart{publicStringtoString(){returngetClass().getSimpleName();}staticList<Factory<?extendsPart>>partFactories=newArrayList<Factory<?extendsPart>>();static{// Collections.addAll() gives an "unchecked generic// array creation ... for varargs parameter" warning.partFactories.add(newFuelFilter.Factory());partFactories.add(newAirFilter.Factory());partFactories.add(newCabinAirFilter.Factory());partFactories.add(newOilFilter.Factory());partFactories.add(newFanBelt.Factory());partFactories.add(newPowerSteeringBelt.Factory());partFactories.add(newGeneratorBelt.Factory());}privatestaticRandomrand=newRandom(47);publicstaticPartcreateRandom(){intn=rand.nextInt(partFactories.size());returnpartFactories.get(n).create();//随机获取Factory并调用create方法}}classFilterextendsPart{}classFuelFilterextendsFilter{// Create a Class Factory for each specific type:publicstaticclassFactoryimplementstypeinfo.factory.Factory<FuelFilter>{publicFuelFiltercreate(){returnnewFuelFilter();}}}classAirFilterextendsFilter{publicstaticclassFactoryimplementstypeinfo.factory.Factory<AirFilter>{publicAirFiltercreate(){returnnewAirFilter();}}}classCabinAirFilterextendsFilter{publicstaticclassFactoryimplementstypeinfo.factory.Factory<CabinAirFilter>{publicCabinAirFiltercreate(){returnnewCabinAirFilter();}}}classOilFilterextendsFilter{publicstaticclassFactoryimplementstypeinfo.factory.Factory<OilFilter>{publicOilFiltercreate(){returnnewOilFilter();}}}classBeltextendsPart{}classFanBeltextendsBelt{publicstaticclassFactoryimplementstypeinfo.factory.Factory<FanBelt>{publicFanBeltcreate(){returnnewFanBelt();}}}classGeneratorBeltextendsBelt{publicstaticclassFactoryimplementstypeinfo.factory.Factory<GeneratorBelt>{publicGeneratorBeltcreate(){returnnewGeneratorBelt();}}}classPowerSteeringBeltextendsBelt{publicstaticclassFactoryimplementstypeinfo.factory.Factory<PowerSteeringBelt>{publicPowerSteeringBeltcreate(){returnnewPowerSteeringBelt();}}}publicclassRegisteredFactories{publicstaticvoidmain(String[]args){for(inti=0;i<10;i++)System.out.println(Part.createRandom());}}/* Output:GeneratorBeltCabinAirFilterGeneratorBeltAirFilterPowerSteeringBeltCabinAirFilterFuelFilterPowerSteeringBeltPowerSteeringBeltFuelFilter*///:~
//: typeinfo/FamilyVsExactType.java// The difference between instanceof and classpackagetypeinfo;import staticnet.mindview.util.Print.*;classBase{}classDerivedextendsBase{}publicclassFamilyVsExactType{staticvoidtest(Objectx){print("Testing x of type "+x.getClass());print("x instanceof Base "+(xinstanceofBase));print("x instanceof Derived "+(xinstanceofDerived));print("Base.isInstance(x) "+Base.class.isInstance(x));print("Derived.isInstance(x) "+Derived.class.isInstance(x));print("x.getClass() == Base.class "+(x.getClass()==Base.class));print("x.getClass() == Derived.class "+(x.getClass()==Derived.class));print("x.getClass().equals(Base.class)) "+(x.getClass().equals(Base.class)));print("x.getClass().equals(Derived.class)) "+(x.getClass().equals(Derived.class)));}publicstaticvoidmain(String[]args){test(newBase());test(newDerived());}}/* Output:Testing x of type class typeinfo.Basex instanceof Base truex instanceof Derived falseBase.isInstance(x) trueDerived.isInstance(x) falsex.getClass() == Base.class truex.getClass() == Derived.class falsex.getClass().equals(Base.class)) truex.getClass().equals(Derived.class)) falseTesting x of type class typeinfo.Derivedx instanceof Base truex instanceof Derived trueBase.isInstance(x) trueDerived.isInstance(x) truex.getClass() == Base.class falsex.getClass() == Derived.class truex.getClass().equals(Base.class)) falsex.getClass().equals(Derived.class)) true*///:~
//: typeinfo/ShowMethods.java// Using reflection to show all the methods of a class,// even if the methods are defined in the base class.// {Args: ShowMethods}importjava.lang.reflect.*;importjava.util.regex.*;import staticnet.mindview.util.Print.*;publicclassShowMethods{privatestaticStringusage="usage:\n"+"ShowMethods qualified.class.name\n"+"To show all methods in class or:\n"+"ShowMethods qualified.class.name word\n"+"To search for methods involving 'word'";privatestaticPatternp=Pattern.compile("\\w+\\.");publicstaticvoidmain(String[]args){if(args.length<1){print(usage);System.exit(0);}intlines=0;try{Class<?>c=Class.forName(args[0]);Method[]methods=c.getMethods();//返回Method对象的数组Constructor[]ctors=c.getConstructors();//返回Constructor对象的数组if(args.length==1){for(Methodmethod:methods)print(p.matcher(method.toString()).replaceAll(""));for(Constructorctor:ctors)print(p.matcher(ctor.toString()).replaceAll(""));lines=methods.length+ctors.length;}else{for(Methodmethod:methods)if(method.toString().indexOf(args[1])!=-1){print(p.matcher(method.toString()).replaceAll(""));lines++;}for(Constructorctor:ctors)if(ctor.toString().indexOf(args[1])!=-1){print(p.matcher(ctor.toString()).replaceAll(""));lines++;}}}catch(ClassNotFoundExceptione){print("No such class: "+e);}}}/* Output:public static void main(String[])public native int hashCode()public final native Class getClass()public final void wait(long,int) throws InterruptedExceptionpublic final void wait() throws InterruptedExceptionpublic final native void wait(long) throws InterruptedExceptionpublic boolean equals(Object)public String toString()public final native void notify()public final native void notifyAll()public ShowMethods()*///:~
//: typeinfo/SelectingMethods.java// Looking for particular methods in a dynamic proxy.importjava.lang.reflect.*;import staticnet.mindview.util.Print.*;classMethodSelectorimplementsInvocationHandler{privateObjectproxied;publicMethodSelector(Objectproxied){this.proxied=proxied;}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{if(method.getName().equals("interesting"))print("Proxy detected the interesting method");returnmethod.invoke(proxied,args);}}interfaceSomeMethods{voidboring1();voidboring2();voidinteresting(Stringarg);voidboring3();}classImplementationimplementsSomeMethods{publicvoidboring1(){print("boring1");}publicvoidboring2(){print("boring2");}publicvoidinteresting(Stringarg){print("interesting "+arg);}publicvoidboring3(){print("boring3");}}classSelectingMethods{publicstaticvoidmain(String[]args){SomeMethodsproxy=(SomeMethods)Proxy.newProxyInstance(SomeMethods.class.getClassLoader(),newClass[]{SomeMethods.class},newMethodSelector(newImplementation()));proxy.boring1();proxy.boring2();proxy.interesting("bonobo");proxy.boring3();}}/* Output:boring1boring2Proxy detected the interesting methodinteresting bonoboboring3*///:~
//: typeinfo/Person.java// A class with a Null Object.importnet.mindview.util.*;classPerson{publicfinalStringfirst;publicfinalStringlast;publicfinalStringaddress;// etc.publicPerson(Stringfirst,Stringlast,Stringaddress){this.first=first;this.last=last;this.address=address;}publicStringtoString(){return"Person: "+first+" "+last+" "+address;}publicstaticclassNullPersonextendsPersonimplementsNull{privateNullPerson(){super("None","None","None");}publicStringtoString(){return"NullPerson";}}publicstaticfinalPersonNULL=newNullPerson();}///:~
//: typeinfo/SnowRemovalRobot.javaimportjava.util.*;publicclassSnowRemovalRobotimplementsRobot{privateStringname;publicSnowRemovalRobot(Stringname){this.name=name;}publicStringname(){returnname;}publicStringmodel(){return"SnowBot Series 11";}publicList<Operation>operations(){returnArrays.asList(newOperation(){publicStringdescription(){returnname+" can shovel snow";}publicvoidcommand(){System.out.println(name+" shoveling snow");}},newOperation(){publicStringdescription(){returnname+" can chip ice";}publicvoidcommand(){System.out.println(name+" chipping ice");}},newOperation(){publicStringdescription(){returnname+" can clear the roof";}publicvoidcommand(){System.out.println(name+" clearing roof");}});}publicstaticvoidmain(String[]args){Robot.Test.test(newSnowRemovalRobot("Slusher"));}}/* Output:Robot name: SlusherRobot model: SnowBot Series 11Slusher can shovel snowSlusher shoveling snowSlusher can chip iceSlusher chipping iceSlusher can clear the roofSlusher clearing roof*///:~
//: typeinfo/NullRobot.java// Using a dynamic proxy to create a Null Object.importjava.lang.reflect.*;importjava.util.*;importnet.mindview.util.*;classNullRobotProxyHandlerimplementsInvocationHandler{privateStringnullName;privateRobotproxied=newNRobot();NullRobotProxyHandler(Class<?extendsRobot>type){nullName=type.getSimpleName()+" NullRobot";}privateclassNRobotimplementsNull,Robot{publicStringname(){returnnullName;}publicStringmodel(){returnnullName;}publicList<Operation>operations(){returnCollections.emptyList();}}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{returnmethod.invoke(proxied,args);}}publicclassNullRobot{publicstaticRobotnewNullRobot(Class<?extendsRobot>type){return(Robot)Proxy.newProxyInstance(NullRobot.class.getClassLoader(),newClass[]{Null.class,Robot.class},//newNullRobotProxyHandler(type));//SnowRemovalRobot实现Null接口。}publicstaticvoidmain(String[]args){Robot[]bots={newSnowRemovalRobot("SnowBee"),newNullRobot(SnowRemovalRobot.class)};for(Robotbot:bots)Robot.Test.test(bot);}}/* Output:Robot name: SnowBeeRobot model: SnowBot Series 11SnowBee can shovel snowSnowBee shoveling snowSnowBee can chip iceSnowBee chipping iceSnowBee can clear the roofSnowBee clearing roof[Null Robot]Robot name: SnowRemovalRobot NullRobotRobot model: SnowRemovalRobot NullRobot*///:~
//: typeinfo/HiddenImplementation.java// Sneaking around package access.importtypeinfo.interfacea.*;importtypeinfo.packageaccess.*;importjava.lang.reflect.*;publicclassHiddenImplementation{publicstaticvoidmain(String[]args)throwsException{Aa=HiddenC.makeA();a.f();System.out.println(a.getClass().getName());// Compile error: cannot find symbol 'C':/* if(a instanceof C) { C c = (C)a; c.g(); } */// Oops! Reflection still allows us to call g():callHiddenMethod(a,"g");// And even methods that are less accessible!callHiddenMethod(a,"u");callHiddenMethod(a,"v");callHiddenMethod(a,"w");}staticvoidcallHiddenMethod(Objecta,StringmethodName)throwsException{Methodg=a.getClass().getDeclaredMethod(methodName);g.setAccessible(true);g.invoke(a);}}/* Output:public C.f()typeinfo.packageaccess.Cpublic C.g()package C.u()protected C.v()private C.w()*///:~