Book09-No.14 部类信息

Book09-No.14 类型信息

1、创建Class对象:每个类都有一个Class对象

 

Class<?> classType = Class.forName("包.类名"); //在创建class对象的时候,初始化了类

 

或者

 

Class<?> classType = 类名.class; //没有初始化类

 

2、通过Class创建实例对象: 

 

Class<T> classType = Class.forName("包.类名");

T obj = classType.newInstrance();

 

3、PetCount代码:

 

 

package Part14;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;
import java.util.Map.Entry;

public class PetCount {

	private static class PetCounter extends HashMap<String, Integer> {
		
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public void count(String type) {
			Integer index = this.get(type);
			if(index == null) {
				this.put(type, 1);
			} else {
				this.put(type, index + 1);
			}
			
		}
	}
	
	public static void countPets(PetCreator creator) {
		PetCounter petCounter = new PetCounter();
		for(Pet pet : creator.createArray(50)) {
			if(pet instanceof Pet) {
				petCounter.count("Pet");
			}
			if(pet instanceof Dogs) {
				petCounter.count("Dogs");
			}
			if(pet instanceof Mutt) {
				petCounter.count("Mutt");
			}
			if(pet instanceof Pug) {
				petCounter.count("Pug");
			}
			if(pet instanceof Hamster) {
				petCounter.count("Hamster");
			}
			if(pet instanceof Mouse) {
				petCounter.count("Mouse");
			}
			if(pet instanceof Rat) {
				petCounter.count("Rat");
			}
			if(pet instanceof Rodent) {
				petCounter.count("Rodent");
			}
			if(pet instanceof Cymrix) {
				petCounter.count("Cymrix");
			}
			if(pet instanceof Manx) {
				petCounter.count("Manx");
			}
			if(pet instanceof Egy) {
				petCounter.count("Egy");
			}
			if(pet instanceof Cat) {
				petCounter.count("Cat");
			}
		}
		
		System.out.println(petCounter);
	}
	
	public static void main(String[] args) {
		countPets(new ForNameCreator());
		countPets(Pets.creator);
	}
}

class PetCount2 {
	private static class PetCounter extends LinkedHashMap<Class<? extends Pet>, Integer> {

		public PetCounter() {
			map(LiteralPetCreator.allTypes, 0);		
		}
		
		public void count(Pet pet) {
			for(Entry<Class<? extends Pet>, Integer> pair : this.entrySet()) {
				if(pair.getKey().isInstance(pet)) {
					put(pair.getKey(), pair.getValue() + 1);
				}
			}
		}
		
		public void map(List<Class<? extends Pet>> list, Integer value) {
			
			for(Class<? extends Pet> key : list) {
				put(key, value);
			}
		}
		
		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append("{");
			for(Entry<Class<? extends Pet>, Integer> pair : this.entrySet()) {
				sb.append(pair.getKey().getSimpleName()).append("=").append(pair.getValue()).append(", ");
			}
			sb.delete(sb.length() - 2, sb.length());
			sb.append("}");
			
			return sb.toString();
		}
	}
	
	public static void main(String[] args) {
		PetCounter petCounter = new PetCounter();
		for(Pet pet : Pets.createArray(50)) {
			petCounter.count(pet);
		}
		System.out.println(petCounter);
		
	}
	
}

class TypeCounter extends HashMap<Class<?>, Integer> {
	
	private Class<?> baseType;
	
	public TypeCounter(Class<?> type) {
		this.baseType = type;
	}
	
	public void count(Object obj) {
		Class<?> type = obj.getClass();
		if(!baseType.isAssignableFrom(type)) {
			throw new RuntimeException(obj + "is not type " + baseType);
		}
		countClass(type);
	}

	private void countClass(Class<?> type) {
		Integer value = get(type);
		put(type, value == null ? 1 : value + 1);
		Class<?> superClass = type.getSuperclass();
		if(superClass != null && baseType.isAssignableFrom(superClass)) {
			countClass(superClass);
		}
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("{");
		for(Entry<Class<?>, Integer> pair : this.entrySet()) {
			sb.append(pair.getKey().getSimpleName()).append("=").append(pair.getValue()).append(", ");
		}
		sb.delete(sb.length() - 2, sb.length());
		sb.append("}");
		
		return sb.toString();
	}
}

class PetCount3 {
	
	public static void main(String[] args) {
		TypeCounter typeCounter = new TypeCounter(Pet.class);
		for(Pet pet : Pets.createArray(50)) {
			typeCounter.count(pet);
		}
		System.out.println(typeCounter);
	}
}

abstract class PetCreator {
	private Random ramdom = new Random();
	public abstract List<Class<? extends Pet>> types();
	
	public Pet getPet() throws InstantiationException, IllegalAccessException {
		int index = ramdom.nextInt(types().size());
		return types().get(index).newInstance();
	}
	
	public Pet[] createArray(int size) {
		Pet[] pets = new Pet[size];
		for(int i=0; i<size; ++i) {
			try {
				pets[i] = getPet();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return pets;
	}
	
	public List<Pet> createArrayList(int size) {
		List<Pet> pets = new ArrayList<Pet>();
		Collections.addAll(pets, createArray(size));
		
		return pets;
	}
}

class ForNameCreator extends PetCreator {

	private static List<Class<? extends Pet>> types = new ArrayList<Class<? extends Pet>>();
	
	
	public ForNameCreator() {
		try {
			road();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private static String[] names = {
			"Part14.Dogs", 
			"Part14.Mutt",
			"Part14.Pug",
			"Part14.Cat",
			"Part14.Egy",
			"Part14.Manx",
			"Part14.Cymrix",
			"Part14.Rodent",
			"Part14.Rat",
			"Part14.Mouse",
			"Part14.Hamster"
	};
	
	@SuppressWarnings("unchecked")
	private static void road() throws ClassNotFoundException {
		for(String name : names) {
			types.add((Class<? extends Pet>) Class.forName(name));
		}
	}
	
	@Override
	public List<Class<? extends Pet>> types() {
		// TODO Auto-generated method stub
		return types;
	}
	
}

class LiteralPetCreator extends PetCreator {

	@SuppressWarnings("unchecked")
	public static final List<Class<? extends Pet>> allTypes = 
		Collections.unmodifiableList(Arrays.asList(
				Pug.class, Pet.class, Dogs.class, Mutt.class, 
				Cat.class, Egy.class, Manx.class, Cymrix.class, 
				Rodent.class, Rat.class, Mouse.class, Hamster.class));
	
	@SuppressWarnings("unused")
	private static final List<Class<? extends Pet>> types = 
		allTypes.subList(allTypes.indexOf(Mutt.class), allTypes.size());
	
	@Override
	public List<Class<? extends Pet>> types() {
		// TODO Auto-generated method stub
		return allTypes;
	}
	
}

class Pets {
	public static final LiteralPetCreator creator = new LiteralPetCreator();
	
	public static Pet randomPet() throws InstantiationException, IllegalAccessException {
		return creator.getPet();
	}
	
	public static Pet[] createArray(int size) {
		return creator.createArray(size);
	}
	
	public static List<Pet> createList(int size) {
		return creator.createArrayList(size);
	}
}

abstract class Indicidual {
	private static long counter = 0;
	private final long id = counter++;
	
	private String name;
	
	public Indicidual() {
		
	}
	
	public Indicidual(String name) {
		this.name = name;
	}

	public long getId() {
		return id;
	}

	@Override
	public String toString() {
		return name + " : id";
	}	
}

class Person extends Indicidual {
	public Person(String name) {
		super(name);
	}
	
	public Person() {
		super();
	}
}

class Pet extends Indicidual {
	public Pet(String name) {
		super(name);
	}
	
	public Pet() {
		super();
	}
}

class Dogs extends Pet {
	public Dogs(String name) {
		super(name);
	}
	
	public Dogs() {
		super();
	}
}
class Mutt extends Dogs {
	public Mutt(String name) {
		super(name);
	}
	
	public Mutt() {
		super();
	}
}
class Pug extends Dogs {
	public Pug(String name) {
		super(name);
	}
	
	public Pug() {
		super();
	}
}
class Cat extends Pet {
	public Cat(String name) {
		super(name);
	}
	
	public Cat() {
		super();
	}
}
class Egy extends Cat {
	public Egy(String name) {
		super(name);
	}
	
	public Egy() {
		super();
	}
}
class Manx extends Cat {
	public Manx(String name) {
		super(name);
	}
	
	public Manx() {
		super();
	}
}
class Cymrix extends Manx {
	public Cymrix(String name) {
		super(name);
	}
	
	public Cymrix() {
		super();
	}
}
class Rodent extends Pet {
	public Rodent(String name) {
		super(name);
	}
	
	public Rodent() {
		super();
	}
}
class Rat extends Rodent {
	public Rat(String name) {
		super(name);
	}
	
	public Rat() {
		super();
	}
}
class Mouse extends Rat {
	public Mouse(String name) {
		super(name);
	}
	
	public Mouse() {
		super();
	}
}
class Hamster extends Rodent {
	public Hamster(String name) {
		super(name);
	}
	
	public Hamster() {
		super();
	}
}

 

4、注册工厂设计模式:将对象的创建交给类自己去完成

 

 

package Part14;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class RegisteredFactories {

	public static void main(String[] args) {
		for(int i=0; i<50; ++i) {
			System.out.println(Part.createRandom());
		}
		
		TypeCount counter = new TypeCount(Part.class);
		for(Part part : Part.createArray(50)) {
			counter.count(part);
		}
		System.out.println(counter);
	}
}

interface Factory<T> {
	
	T create();
}

class Part {
	
	public static final List<Factory<? extends Part>> partsFactories = new ArrayList<Factory<? extends Part>>();
	
	static {
		partsFactories.add(new FuelFilter.Factory());
		partsFactories.add(new AirFilyer.Factory());
		partsFactories.add(new CabinAirFilter.Factory());
		partsFactories.add(new OilFilter.Factory());
		partsFactories.add(new GeneratorBelt.Factory());
		partsFactories.add(new PowerSteeringBelt.Factory());
	}

	@Override
	public String toString() {
		return getClass().getSimpleName();
	}
	
	public static Random random = new Random();
	
	public static Part createRandom() {
		int index = random.nextInt(partsFactories.size());
		return partsFactories.get(index).create();
	}
	
	public static Part[] createArray(int size) {
		Part[] parts = new Part[size];
		for(int i=0; i<size; ++i) {
			parts[i] = createRandom();
		}
		
		return parts;
	}
}

class Filter extends Part {
	
}

class FuelFilter extends Filter {
	
	public static class Factory implements Part14.Factory<FuelFilter> {

		@Override
		public FuelFilter create() {
			return new FuelFilter();
		}
		
	}
}

class AirFilyer extends Filter {
	public static class Factory implements Part14.Factory<AirFilyer> {

		@Override
		public AirFilyer create() {
			return new AirFilyer();
		}
		
	}
}

class CabinAirFilter extends Filter {
	public static class Factory implements Part14.Factory<CabinAirFilter> {

		@Override
		public CabinAirFilter create() {
			return new CabinAirFilter();
		}
		
	}
}

class OilFilter extends Filter {
	public static class Factory implements Part14.Factory<OilFilter> {

		@Override
		public OilFilter create() {
			return new OilFilter();
		}
		
	}
}

class Belt extends Part {
	
}

class GeneratorBelt extends Belt {
	public static class Factory implements Part14.Factory<GeneratorBelt> {

		@Override
		public GeneratorBelt create() {
			return new GeneratorBelt();
		}
		
	}
}

class PowerSteeringBelt extends Belt {
	public static class Factory implements Part14.Factory<PowerSteeringBelt> {

		@Override
		public PowerSteeringBelt create() {
			return new PowerSteeringBelt();
		}
		
	}
}

class TypeCount extends HashMap<Class<?>, Integer> {
	private Class<?> baseType;
	
	public TypeCount(Class<?> type) {
		this.baseType = type;
	}
	
	public void count(Object obj) {
		Class<?> type = obj.getClass();
		if(!baseType.isAssignableFrom(type)) {
			throw new RuntimeException(obj + "is not type " + baseType);
		}
		countClass(type);
	}

	private void countClass(Class<?> type) {
		Integer key = get(type);
		put(type, key == null ? 1 : key + 1);
		Class<?> superClass = type.getSuperclass();
		if(baseType.isAssignableFrom(superClass)) {
			countClass(superClass);
		}
		
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		for(Map.Entry<Class<?>, Integer> entry : this.entrySet()) {
			sb.append(entry.getKey().getSimpleName()).append("=").append(entry.getValue()).append(", ");
		}
		sb.delete(sb.length() - 2, sb.length());
		return sb.toString();
	}
	
	
}

 

 5、反射

 

package Part14;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.regex.Pattern;

public class ShowMethods {

	private static Pattern pattern = Pattern.compile("(\\w+\\.)|(\\sfinal)|(\\snative)");
	
	public static void main(String[] args) {
		Class<?> myClass = null;
		try {
			myClass = Class.forName("Part14.ShowMethods");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Method[] methods = myClass.getMethods();
		Constructor[] cons = myClass.getConstructors();
		
		for(Method method : methods) {
			System.out.println(pattern.matcher(method.toString()).replaceAll(""));
		}
		
		for(Constructor con : cons) {
			System.out.println(pattern.matcher(con.toString()).replaceAll(""));
		}
	}
}

 

 6、简单代理

 

package Part14;

/**
 * 简单代理
 * @author Administrator
 *
 */
public class SimpleProxyDemo {

	public static void main(String[] args) {
		RealObject object = new RealObject();
		consumer(object);
		SimpleProxy proxy = new SimpleProxy(object);
		consumer(proxy);
	}
	
	public static void consumer(Interface inter) {
		inter.doSomething();
		inter.somethingElse("baobo");
	}
}

interface Interface {
	void doSomething();	
	void somethingElse(String param);
}

class RealObject implements Interface {

	@Override
	public void doSomething() {
		System.out.println("RealObject doSomething()");
		
	}

	@Override
	public void somethingElse(String param) {
		System.out.println("RealObject somethingElse()");	
	}
	
}

class SimpleProxy implements Interface {

	private Interface proxied;
	
	public SimpleProxy(Interface proxied) {
		this.proxied = proxied;
	}
	
	@Override
	public void doSomething() {
		
		System.out.println("SimpleProxy doSomething()");
		proxied.doSomething();
		
	}

	@Override
	public void somethingElse(String param) {
		System.out.println("SimpleProxy somethingElse()");
		proxied.somethingElse(param);
		
	}
	
}

 7、