Class进阶(包含instanceof,Class.isAssignableFrom用法)

本文介绍了一个宠物生成器的实现,包括使用Class.forName()和.class字面常量创建具体类的方法。此外,还展示了如何利用instanceof和Class.isAssignableFrom()进行宠物实例的计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Class进阶(包含instanceof,Class.isAssignableFrom用法)

首先先定义五个类,继承关系如下:

public class Pet {}

public class Dog extends Pet{}

public class Cat extends Pet{}

public class Pug extends Dog{}

public class Manx extends Cat{}

一:创建一个抽象类作为宠物生成器,然后分别用Classs.forName()和.class字面常量两种方式实现该抽象类.

public abstract class PetCreator {

   Random rand=new Random(47);

  public abstract List<Class< ? extends Pet>> types();



/**

 * 随机创建一个宠物

 * @return

 */

public Pet randomPet(){

   int n=rand.nextInt(types().size());

   try{

  //其中types()获得类型被指定为'任何从Pet导出的类',因此newInstance()不需要转型就可以产生Pet

  return types().get(n).newInstance();

  }catch(InstantiationException e){

  throw new RuntimeException(e);

  }catch(IllegalAccessException e){

  //此异常表示默认构造器是private的情况

  throw new RuntimeException(e);

  }

}



/**

 * 创建一个宠物数组

 * @param size

 * @return

 */

public Pet[] createArray(int size){

  Pet[] result=new Pet[size];

  for(int i=0;i<size;i++){

  //createArray使用randomPet()来填充数组。

  result[i]=randomPet();

  }

  return result;

}



/**

 * 创建宠物集合

 * @param size

 * @return

 */

public ArrayList<Pet> arrayList(int size){

  ArrayList<Pet> result=new ArrayList<Pet>();

  //arrayList则是用createArray()来填充

  Collections.addAll(result, createArray(size));

  return result;

  }
}

(1)用class.forname()来创建一个具体的宠物生成器。

loader方法用Class.forName();方法创建了Class对象的List,这可能会产生ClassNotFoundException异常,这么做是有意义的,因为你传递的是一个在编译器无法验证的String。

public class ForNameCreator extends PetCreator{



//设置成static共享,在类第一次被加载的时候进行初始化,节约内存,和时间

private static List<Class<? extends Pet>> types=new ArrayList<Class<? extends Pet>>();

private static String[] typeNames={

"com.tkij.chapter14.Class.InstanceofAndIsInstance.Cat",

"com.tkij.chapter14.Class.InstanceofAndIsInstance.Dog",

"com.tkij.chapter14.Class.InstanceofAndIsInstance.Pug",

"com.tkij.chapter14.Class.InstanceofAndIsInstance.Manx"

};



private static void loader(){

try{

for(String name:typeNames){

types.add((Class<? extends Pet>)Class.forName(name));

}

}catch(ClassNotFoundException e){

throw new RuntimeException(e);

}

}

//静态代码块,在类初始化的时候执行。

static{loader();}

@Override

public List<Class<? extends Pet>> types() {

// TODO Auto-generated method stub

return types;

}

}

(2)用.class字面常量来创建一个具体的宠物生成器。这一次,生成的types的代码不需要放在try块内,因为它会在编译期进行检查,因此不会抛出任何异常,这与Class.forName不一样。

public class LiteralPetCreator extends PetCreator{



//unmodifiableList()函数是将list变为不可修改

public static final List<Class< ? extends Pet>> allTypes=Collections.unmodifiableList(Arrays.asList(Pet.class,

Dog.class,Cat.class,Pug.class,Manx.class

));

private static final List<Class<? extends Pet>> types=allTypes.subList(allTypes.indexOf(Dog.class), allTypes.size());



@Override

public List<Class<? extends Pet>> types() {

// TODO Auto-generated method stub

return types;

}



public static void main(String[] args) {

System.out.println(types);

}



}

二:创建计数器,利用宠物生成器生成宠物集合,然后测试,每种宠物的数量,下面也有两种计数器,第一种使用instanceof实现的。第二种使用Class.isAssignableFrom()实现的递归计数.

(1)为了对Pet进行计数,我们还需要一个计数器能保存不同类型的Pet的数量的工具。Map是次需求的首选,其中键是宠物名,而值是保存Pet数量的Integer,通过这种方式,你可以询问,有多少个猫对象?我们可以用instanceof对Pet进行计数.

public class PetCount {

//定义一个计数器

static class PetCounter extends HashMap<String ,Integer>{

public void count(String type){

Integer quantity=get(type);

if(quantity!=null){

put(type,quantity+1);

}else{

put(type,1);

}

}

}



/**

 * 对随机生成的宠物进行归类计数

 * @param creator 宠物创建器

 */

public static void countPets(PetCreator creator){

PetCounter counter=new PetCounter();

List<Pet> pets=creator.arrayList(20);

for(Pet pet:pets){

if(pet instanceof Pet){

counter.count("Pet");

}

if(pet instanceof Dog){

counter.count("Dog");

}

if(pet instanceof Cat){

counter.count("Cat");

}

if(pet instanceof Pug){

counter.count("Pug");

}

if(pet instanceof Manx){

counter.count("Manx");

}

}

System.out.println(counter);

}



public static void main(String[] args) {

System.out.println("ForNameCreator生成的随机宠物!");

countPets(new ForNameCreator());

System.out.println("LiteralPetCreator生成的随机宠物!");

countPets(new LiteralPetCreator());

}

}

(2)用Class.isAssignableFrom()实现递归计数

public class TypeCounter extends HashMap<Class<?>,Integer>{

private Class<?> baseType;

public TypeCounter(Class<?> baseType){

this.baseType=baseType;

}



public void count(Object obj){

Class<?> type=obj.getClass();

if(!baseType.isAssignableFrom(type)){

throw new RuntimeException(obj+"incorrect type"+type+",should be type or subtype of"+baseType);

}

countClass(type);

}



private void countClass(Class<?> type){

Integer quality=get(type);

put(type,quality==null?1:quality+1);

Class<?> superClass=type.getSuperclass();

if(superClass!=null&&baseType.isAssignableFrom(superClass)){

countClass(superClass);//递归计数

}

}



public String toString(){

StringBuilder result=new StringBuilder("{");

for(Map.Entry<Class<?>,Integer> pair :entrySet()){

result.append(pair.getKey().getSimpleName());

result.append("=");

result.append(pair.getValue());

result.append(",");

}

result.delete(result.length()-1, result.length());

result.append("}");

return result.toString();

}





public static void main(String[] args) {

TypeCounter counter=new TypeCounter(Pet.class);

PetCreator pc=new LiteralPetCreator();

for(Pet pet:pc.arrayList(20)){

counter.count(pet);

}

System.out.println(counter);

}



}

 

/** * 自动关联 * @param e * @param <T> * @throws IllegalAccessException * @throws ClassNotFoundException */ private static <T extends SynchronizableEntity> void setDefaultAssociation(SynchronizedList<T> e ) throws IllegalAccessException, ClassNotFoundException { for (T t:e) { Class clazz=t.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field f:fields){ f.setAccessible(true); Class s=f.getType(); if(SynchronizableEntity.class.isAssignableFrom(s)){ if (t.getId()<0 ||f.get(t)==null|| ((SynchronizableEntity)f.get(t)).getId()==null) { f.set(t, dataCollectionMap.get(s).get(0)); }else { f.set(t, dataCollectionMap.get(s).get( ((SynchronizableEntity)f.get(t)).getId())); } } if (List.class.isAssignableFrom(s)){ Type genericSuperclass = s.getGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) genericSuperclass; Type[] types = pt.getActualTypeArguments(); // System.out.println("集合类型: " + types[0].getTypeName()); // User Log.d(TAG, "setDefaultAssociation: "+types[0].getTypeName()); Class c=Class.forName(types[0].getTypeName()); if(SynchronizableEntity.class.isAssignableFrom(c)) { List<SynchronizableEntity> l = (List<SynchronizableEntity>) f.get(t); if (l == null) { l = new ArrayList(); } if (l.isEmpty() || t.getId() < 0) { l.add(dataCollectionMap.get(c).get(0)); } if (!l.isEmpty()) { for (int i = 0; i < l.size(); i++) { //Log.d(TAG, "setDefaultAssociation: "); l.set(i,dataCollectionMap.get(c).get( l.get(i).getId())); } } } } } } } }
06-13
package com.example.kucun2.DataPreserver; import android.util.Log; import com.example.kucun2.entity.data.SynchronizableEntity; import com.example.kucun2.entity.data.SynchronizedList; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class DataAssociator { private final DataStore dataStore; public DataAssociator(DataStore dataStore) { this.dataStore = dataStore; } public void automaticAssociation() { dataStore.dataCollectionMap.keySet().forEach(entityClass -> { try { associateEntities(dataStore.dataCollectionMap.get(entityClass)); } catch (Exception e) { Log.e("DataAssociator", "关联失败: " + entityClass.getSimpleName(), e); } }); } private void associateEntities(SynchronizedList<?> list) throws Exception { for (SynchronizableEntity entity : list.getViewList()) { if (entity == null) continue; for (Field field : entity.getClass().getDeclaredFields()) { field.setAccessible(true); Class<?> fieldType = field.getType(); if (SynchronizableEntity.class.isAssignableFrom(fieldType)) { associateSingleReference(entity, field); } else if (List.class.isAssignableFrom(fieldType)) { associateReferenceList(entity, field); } } } } private void associateSingleReference(SynchronizableEntity entity, Field field) throws Exception { SynchronizableEntity ref = (SynchronizableEntity) field.get(entity); if (ref == null) return; Class<?> targetType = field.getType(); SynchronizableEntity target = findTargetEntity(ref, targetType); field.set(entity, target); } private SynchronizableEntity findTargetEntity(SynchronizableEntity ref, Class<?> targetType) { SynchronizedList<?> targetList = dataStore.dataCollectionMap.get(targetType); if (targetList == null) return null; // 预置对象特殊处理 if (ref.getId() == -1) { return targetList.getViewList().stream() .filter(e -> e.getId() == -1) .findFirst().orElse(null); } // 根据ID查找实体 return targetList.getViewList().stream() .filter(e -> ref.getId().equals(e.getId())) .findFirst() .orElse(null); } private void associateReferenceList(SynchronizableEntity entity, Field field) throws Exception { Type genericType = field.getGenericType(); if (!(genericType instanceof ParameterizedType)) return; Type itemType = ((ParameterizedType) genericType).getActualTypeArguments()[0]; if (!(itemType instanceof Class) || !SynchronizableEntity.class.isAssignableFrom((Class<?>) itemType)) { return; } List<?> refList = (List<?>) field.get(entity); if (refList == null) { field.set(entity, new ArrayList<>()); return; } List<SynchronizableEntity> resolvedList = new ArrayList<>(); for (Object ref : refList) { if (ref instanceof SynchronizableEntity) { SynchronizableEntity resolved = findTargetEntity( (SynchronizableEntity) ref, (Class<?>) itemType ); if (resolved != null) resolvedList.add(resolved); } } field.set(entity, resolvedList); } } 详细注释
最新发布
06-25
package com.kucun.Service; import java.io.Serializable; import java.lang.reflect.*; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.domain.Example; import org.springframework.data.domain.ExampleMatcher; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import com.kucun.data.entity.Bancai; import com.kucun.data.entity.Dingdan_chanpin; import com.kucun.data.entity.Dingdan_chanpin_zujian; import com.kucun.data.entity.EntityBasis; import com.kucun.data.entity.Information; import com.kucun.data.entity.Kucun; import com.kucun.dataDo.BancaiRepository; import com.kucun.dataDo.CaizhiRepository; import com.kucun.dataDo.ChanpinRepository; import com.kucun.dataDo.ChanpinZujianRepository; import com.kucun.dataDo.DingdanChanpinRepository; import com.kucun.dataDo.DingdanChanpinZujianRepository; import com.kucun.dataDo.DingdanRepository; import com.kucun.dataDo.KucunRepository; import com.kucun.dataDo.MupiRepository; import com.kucun.dataDo.UserRepository; import com.kucun.dataDo.ZujianRepository; @Service public class AppService { // 注入所有需要的Repository @Autowired private CaizhiRepository caizhiRepository; @Autowired private BancaiRepository bancaiRepository; @Autowired private ChanpinRepository chanpinRepository; @Autowired private DingdanRepository dingdanRepository; @Autowired private MupiRepository mupiRepository; @Autowired private ZujianRepository zujianRepository; @Autowired private KucunRepository kucunRepository; @Autowired private UserRepository userRepository; @Autowired private ChanpinZujianRepository chanpinZujianRepository; @Autowired private DingdanChanpinZujianRepository dingdanChanpinZujianRepository; @Autowired private DingdanChanpinRepository dingdanChanpinRepository; @Autowired private DynamicRepositoryService repositoryService; @Autowired private EntityDependencyService dependencyService; public Information getAllDataWithChildIdse() { Map<String, Object> response = new HashMap<>(); for (String key : repositoryService.getRepositoryNameMap().keySet()) { response.put(key+"s", (repositoryService.getJpaRepository(key).findAll())); } return Information.NewSuccess(response); } public Information getAllDataWithChildIdse(String e) { JpaRepository<?, ?> jp = repositoryService.getJpaRepository(e); System.out.println(jp); return Information.NewSuccess(jp.findAll()); } public Information getAddEntity(Object e) { Class<?> entityClass = e.getClass(); try { // 处理关联字段 handleAssociations(e); @SuppressWarnings("unchecked") JpaRepository<Object, Serializable> jp = (JpaRepository<Object, Serializable>) repositoryService.getJpaRepository(entityClass); Object savedEntity = jp.save(e); if(savedEntity!=null) { if(savedEntity instanceof Bancai) { initializeKucunForBancai((Bancai)savedEntity); } } return Information.NewSuccess(savedEntity); } catch (Exception ex) { return Information.Newfail(500, "创建失败: " + ex.getMessage(), null); } } // 单独封装库存初始化方法 private void initializeKucunForBancai(Bancai bancai) throws Exception { Kucun kucun = new Kucun(null, bancai, 0); // 初始库存为0 try { bancai.setKucun(kucunRepository.save(kucun)); } catch (Exception e) { // TODO: handle exception throw new Exception("initializeKucunForBancai"+e); } } // 处理关联对象(转换为托管实体) private void handleAssociations(Object entity) throws Exception { Class<?> clazz = entity.getClass(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); Object value = field.get(entity); if (value == null) continue; // 处理单个关联实体 if (isEntityBasisField(field)) { EntityBasis associatedEntity = (EntityBasis) value; JpaRepository<Object, Serializable> repo = (JpaRepository<Object, Serializable>) repositoryService.getJpaRepository(associatedEntity.getClass()); // 获取托管状态的关联实体 Object managedEntity = repo.findById(associatedEntity.getId()) .orElseThrow(() -> new RuntimeException("关联实体不存在")); field.set(entity, managedEntity); } // 处理集合关联 else if (isCollectionField(field)) { Collection<?> collection = (Collection<?>) value; List<Object> managedEntities = new ArrayList<>(); for (Object item : collection) { if (item instanceof EntityBasis) { EntityBasis eb = (EntityBasis) item; JpaRepository<Object, Serializable> repo = (JpaRepository<Object, Serializable>) repositoryService.getJpaRepository(eb.getClass()); Object managedEntity = repo.findById(eb.getId()) .orElseThrow(() -> new RuntimeException("关联实体不存在")); managedEntities.add(managedEntity); } } // 更新集合为托管实体 if (!managedEntities.isEmpty()) { field.set(entity, managedEntities); } } } } /** * 更新 * @param e 实体待id * @return */ /** * 更新实体 * @param e 包含ID的实体 * @return 操作结果 */ public Information getupdateEntity(Object e) { if(e == null) { return Information.Newfail(403, "参数为空", null); } Class<?> entityClass = e.getClass(); try { Field idField = entityClass.getDeclaredField("id"); idField.setAccessible(true); Object idValue = idField.get(e); // 修正:应检查id是否为空,而不是不为空 if(idValue == null) { return Information.Newfail(403, "Id为空", null); } // 获取Repository @SuppressWarnings("unchecked") JpaRepository<Object, Serializable> jp = (JpaRepository<Object, Serializable>) repositoryService.getJpaRepository(entityClass); // 从数据库加载现有实体(托管状态) Object existingEntity = jp.findById((Serializable) idValue) .orElseThrow(() -> new RuntimeException("实体不存在")); // 复制属性(排除关联字段) copyNonNullProperties(e, existingEntity); // 保存托管状态的实体 Object updatedEntity = jp.save(existingEntity); return Information.NewSuccess(updatedEntity); } catch (Exception ex) { return Information.Newfail(500, "更新失败: " + ex.getMessage(), null); } } /** * 删除 * @param entity * @return */ /** * 删除实体 * @param entity 要删除的实体 * @return 操作结果 */ public Information getdeleteEntity(EntityBasis entity) { if (entity == null) { return Information.NewFail("删除对象不能为空"); } Class<?> entityClass = entity.getClass(); String entityName = entityClass.getSimpleName().toLowerCase(); try { // 1. 获取对应的Repository JpaRepository<Object, Serializable> jp = (JpaRepository<Object, Serializable>) repositoryService.getJpaRepository(entityName); // 2. 检查实体是否存在 if (!jp.existsById(entity.getId())) { return Information.NewFail("未找到ID为" + entity.getId() + "的" + entityName); } // 3. 检查依赖关系 if (dependencyService.hasDependencies(entityClass, entity.getId())) { return Information.NewFail("该记录已被其他数据引用,无法删除"); } // 4. 执行删除 jp.deleteById(entity.getId()); // 5. 验证删除结果 if (jp.existsById(entity.getId())) { return Information.NewFail("删除操作失败,记录仍然存在"); } return Information.NewSuccess("删除成功"); } catch (Exception e) { return Information.NewFail("删除过程中发生错误: " + e.getMessage()); } } // 复制非空属性(忽略关联字段) private void copyNonNullProperties(Object source, Object target) throws IllegalAccessException { Class<?> clazz = source.getClass(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); Object value = field.get(source); // 跳过关联字段和特殊字段 if (value != null && !isEntityBasisField(field) && !isCollectionField(field) && !field.getName().equals("id")) { Field targetField; try { targetField = target.getClass().getDeclaredField(field.getName()); targetField.setAccessible(true); targetField.set(target, value); } catch (NoSuchFieldException e) { // 忽略不存在的字段 } } } } // 检查是否为关联实体字段 private boolean isEntityBasisField(Field field) { return EntityBasis.class.isAssignableFrom(field.getType()); } // 检查是否为集合字段 private boolean isCollectionField(Field field) { return Collection.class.isAssignableFrom(field.getType()) || Map.class.isAssignableFrom(field.getType()); } /** * 根据非空属性值动态查询实体 * @param entity 包含查询条件的实体对象(非空属性作为查询条件) * @return 查询结果信息(成功时包含数据列表) */ public <T>Information getSELECTEntity(T entity) { if (entity == null) { return Information.NewFail("查询参数不能为空"); } Class<T> entityClass = (Class<T>) entity.getClass(); try { // 1. 获取非泛型的Repository JpaRepository repository = repositoryService.getJpaRepository(entityClass); // 2. 构建非泛型的Example查询 ExampleMatcher matcher = ExampleMatcher.matching() .withIgnoreNullValues() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING); // 这里直接使用原始类型Example Example<T> example = Example.of(entity);//he type Example is not generic; it cannot be parameterized with arguments <T>the method of(T) is undefined for the type Example // 3. 执行查询 List<?> result = repository.findAll(example); return Information.NewSuccess(result); } catch (ClassCastException e) { return Information.NewFail("Repository类型不匹配: " + e.getMessage()); } catch (DataAccessException e) { return Information.NewFail("数据库访问错误: " + e.getMessage()); } catch (Exception e) { return Information.NewFail("系统错误: " + e.getMessage()); } } private List<Map<String, Object>> convertEntityBasis(List<EntityBasis> entities) { return entities.stream().map(entity -> { Map<String, Object> map = new HashMap<>(); Field[] fields = entity.getClass().getDeclaredFields(); try { // 添加实体自身的基本字段 map.put("id", entity.getId()); // 处理所有字段 for (Field field : fields) { field.setAccessible(true); // 允许访问私有字段 Object fieldValue = field.get(entity); if (fieldValue != null) { String fieldName = field.getName(); // 处理集合类型关联 if (isCollection(field)) { if (!((Collection<?>) fieldValue).isEmpty()) { List<Map<String, Object>> collectionItems = ((Collection<?>) fieldValue) .stream() .filter(item -> item instanceof EntityBasis) .map(item -> { Map<String, Object> itemMap = new HashMap<>(); itemMap.put("id", ((EntityBasis) item).getId()); return itemMap; }) .collect(Collectors.toList()); map.put(fieldName, collectionItems); } } // 处理单个实体关联 else if (implementsInterface(field, EntityBasis.class)) { Map<String, Object> associatedMap = new HashMap<>(); associatedMap.put("id", ((EntityBasis) fieldValue).getId()); map.put(fieldName, associatedMap); } // 处理其他基本类型字段 else if (!isSpecialField(fieldName)) { map.put(fieldName, fieldValue); } } } } catch (IllegalAccessException e) { e.printStackTrace(); } return map; }).collect(Collectors.toList()); } // 判断是否为特殊字段(需要排除的字段) private boolean isSpecialField(String fieldName) { return fieldName.equals("handler") || fieldName.equals("hibernateLazyInitializer"); } /** *-判断属性是否为集合类型 * @param field * @return */ boolean isCollection(Field field) { Class<?> type = field.getType(); // 检查是否为Java内置集合类型 if (Collection.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type) || type.isArray()) { return true; } // 检查是否实现集合相关接口(如Iterable) for (Class<?> interfaceType : type.getInterfaces()) { if (Iterable.class.isAssignableFrom(interfaceType)) { return true; } } return false; } /** * -判断属性是否实现特定接口 * @param field * @param targetInterface * @return */ boolean implementsInterface(Field field, Class<?> targetInterface) { Class<?> type = field.getType(); // 检查类本身是否实现接口 if (targetInterface.isAssignableFrom(type)) { return true; } // 检查实现的接口是否继承目标接口 for (Class<?> interfaceType : type.getInterfaces()) { if (targetInterface.isAssignableFrom(interfaceType)) { return true; } } return false; } private Object convertDingdanChanpins(List<Dingdan_chanpin> findAll) { // TODO Auto-generated method stub return null; } private Object convertDingdanChanpinZujians(List<Dingdan_chanpin_zujian> findAll) { // TODO Auto-generated method stub return null; } } 简化该类,不用创建新类,加入方法注释
06-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值