在学习反射时想到了这个问题,.getClass()和.class有没有什么区别?
.class表示的是文件啊,也就是那个class文件,而getClass()表示的是class对象
.getClass()是一个对象实例的方法,只有对象实例才有这个方法,具体的类是没有的。类的Class类实例是通过.class获得的,显然,类没有.getClass()方法。
从网上还找到一些其他资料:
1、出现的时期不同:Class.forName()和getClass()是在运行时加载;Class.class是在编译器加载,即.class是静态加载,.getClass()是动态加载。
2、举个例子,Iterator it = s.iterator();得到的it的真正类型是KeyIterator,是Iterator 的子类,按常理来说应该可以执行next()方法,但是值得注意的是,KeyIterator是hashmap的内部类,JAVA给的提示是can not access a member of class java.util.HashMap$KeyIterator with modifiers "public"
从上面的那些例子上也能看出,除内部类外的其他类的应用上.class功能完全等于.getClass()!只是一个是用类直接获得的,一个是用实例获得的。
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao{
}
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
@Resource private SessionFactory sessionFactory; public Class<T> clazz; //构造函数又叫构造器,很显然它是为了初始化类的.无参构造函数的好处在于, 调用该构造器,会用默认值去初始化成员. //至于为什么要建一个空参数的和有参数的.因为只要创建了有参数的,就只能用有参数的构造函数,而不能用空参数的,所以要创显式创建一个空参数的构造函数. //类的构造器没有显示的调用超类的方法,则将自动调用父类默认构造器(不带参数构造器)。如果父类没有不带参数的构造器,且子类的构造器中又没显示的调用超类其他构造器, //则Java编译器将报告错误。所以子类使用父类的构造方法是通过super关键字实现的。 @SuppressWarnings("unchecked") public BaseDaoImpl() { // 使用反射技术得到T的真实类型 //this代表当前new的对象(在外部new role就是role这个对象),将BaseDao抽象化就无法实例化可证明不代表此对象 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型 this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个泛型类型参数的真实类型 System.out.println("clazz ---> " + clazz); } /*public BaseDaoImpl() { System.out.println(); }*/ public Session getSession(){ return sessionFactory.getCurrentSession(); } public void save(T entity) { // TODO Auto-generated method stub getSession().save(entity); } public void update(T entity) { // TODO Auto-generated method stub getSession().update(entity); } public void delete(Long id) { // TODO Auto-generated method stub Object object = getById(id);//调用下面的getById得到具体对象 getSession().delete(object); } @SuppressWarnings("unchecked") public T getById(Long id) { // TODO Auto-generated method stub //获得class的两种用法,T.class和T.getClass,但是这里的T不是具体类,无法使用 //T.class和T.getClass()中T不是真实类型,无具体类,无法得到class,所以在该类中此语法不符合 return (T) getSession().get(clazz, id);//通过get方法得到匹配对象,若相应表中无此对象,返回null } @SuppressWarnings("unchecked") public List<T> getByIds(Long[] ids) { return getSession().createQuery(// "FROM User WHERE id IN (:ids)")//FROM User u WHERE u.username = :username .setParameterList("ids", ids)//setParameterLis和setParameter("username",username) .list(); }
@SuppressWarnings("unchecked")
public List<T> findAll() { return getSession().createQuery(// "FROM " + clazz.getSimpleName())// .list(); }
}
|