栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java基础 --反射,泛型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java基础 --反射,泛型

反射
  • 概念:
    反射是一种机制,利用该机制可以在程序运行过程中对该类进行解剖并操作类中的所有成员(成员变量, 成员方法, 构造函数)

反射操作类成员的前提:获取该类字节码文件对象Class对象

三种获取方式
方式1: 通过类名.class获得
方式2: 通过对象名.getClass()获得
方式3: 通过Class类的静态方法获得: Class.forName(“类全名”);
每一个类的Class对像只有一个;

方法说明
class常用方法
String getSimpleName()获取类名
String getName()获取类全名
T newInstance()创建Class对象关联类的对象
Constructor
Constructor getConstructor(Class… parameterTypes)根据参数类型获得对应的public修饰的Constructor对象。
Constructor[] getConstructors()获取所有public修饰的构造方法对象 ,返回数组
Constructor getDeclaredConstructor(Class… parameterTypes)根据参数类型获取任意修饰符对应的Constructor对象
Constructor[] getDeclaredConstructors()获得类中的所有构造方法对象,任意修饰符修饰的 ,返回数组
Constructor常用方法
T newInstance(Object … initargs)根据指定的参数创建对象
void setAccessible(boolean bo)设置是否取消权限检查,true为暴力反射,false表示不取消
Method
Method getMethod(String name,Class…args)获取用public修饰的对应的方法名和参数类型的构造方法对象
Method[] getMethod()获取用所有public修饰的对应的方法名和参数类型的构造方法对象, 返回一个数组
Method getDeclaredMethod(String name,Class…args)获取任意修饰符修饰的对应的方法名和参数类型的构造方法对象
Method[] getDeclaredMethod()获取任意修饰符修饰的对应的方法名和参数类型的构造方法对象,返回一个数组
Method常用方法
Object invoke(Object obj, Object… args)obj:调用指定对象obj的该方法, arge:调用方法时传递的参数
void setAccessible(boolean be)暴力破解
Field
Field getField(String name)根据成员变量名获取public修饰的Field对象
Field[] getFields()根据成员变量名获取public修饰的Field对象,返回一个数组
Field getDeclaredField(String name)根据成员变量名获取任意修饰符修饰的Field对象
Field[] getDeclaredField()根据成员变量名获取任意修饰符修饰的Field对象, 返回一个数组
Field常用方法
setXxx方法都是给对象obj的属性设置使用,针对不同的类型选取不同的方法。
void set(Object obj, Object value)
void setInt(Object obj, int i)
void setLong(Object obj, long l)
void setBoolean(Object obj, boolean z)
void setDouble(Object obj, double d)
getXxx方法是获取对象obj对应的属性值的,针对不同的类型选取不同的方法。
Object get(Object obj)
int getInt(Object obj)
long getLong(Object obj)
boolean getBoolean(Object ob)
double getDouble(Object obj)
void setAccessible(boolean bo)暴力破解
Class getType()获取属性的类型,返回Class对象

泛型

JDK1.5之后新增的语法,使用于未知类型的定义,可以作用在类,方法,接口中。

好处:

  • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败
  • 避免了类型强转的麻烦

定义格式:
修饰符 class 类名<代表泛型的变量>{}

class ArrayList{
       public boolean add(E e){}
       
       public E get(int index){}
}

泛型只需要在创建对象的时候确定类型,如:

class NewArrayList{
     public void demoList(){
          ArrayList arr = new ArrayList<>();
      }
}
//这回ArrayList会如下
class ArrayList{
      public boolean add(String e){}
      public String get(int index){} 

}

泛型方法定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }

public class GenMethod{
     public  void show (T t){
         System.out.println(t.getClass());
     }
     public  T show2 (T t){
     return t;
     }
}

泛型接口:
修饰符 interface 接口名<泛型变量名> {
}

public interface GenInterface{
	public abstract void add(E e);
	
	public abstract E getE();  
}

接口定义的泛型可以在实现类或者实现类对象中确定

泛型通配符:
不知使用什么类型接受的情况下可以使用泛型通配符?来表示未知通配。

void main(String[]args){
    Collection list1 = new ArrayList();
    getElement(list1);
    Collection list2 = new ArrayList();
    getElement(list2);
}

void getElement(Collection coll){}
//?表示任意类型

泛型上限:
格式:类型名称 对象名称
只能接收该类型及其子类

泛型下限:
格式:类型名称 对象名称
只能接收该类型及其父类型

public static void main(String[] args) {
    Collection list1 = new ArrayList();
    Collection list2 = new ArrayList();
    Collection list3 = new ArrayList();
    
    getElement(list1);
    getElement(list2);
    getElement(list3);//报错
  
    getElement2(list1);//报错
    getElement2(list2);
    getElement2(list3);
  
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection coll){}



转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号