泛型注解与反射
1.泛型不是特定的数据类型
泛型限定数据类型的位置:类上(全局),方法上(局部)
使用:参数,方法体内,方法的返回,属性,构造方法内
赋值:
2.?通配图在参数需要根据输入的泛型确定时使用、
3?通配符使用分为两种情况:
(1)方法内直接使用?通配符,此时参数中有通配符的不能直接调用,因为录入的对象无法确定类型(super定义的子类可以确定)
(2)参数中使用?通配符,目的是在参数录入上才确定泛型的类型
extend表示只能是类及其子类,super表示只能是类及其父类
4.通配符的使用在JDK1.8之后才可以使用
//在JDK1.8之后才可以用 //MyClass<?,?,?> mc = new MyClass<>();
5.代码演示
package com.inspur.fangxing; public class MyClass<A,B,C> { private A field1; private B filed2; private C field3; public A getField1() { return field1; } public void setField1(A field1) { if(field1 instanceof Integer){ Integer num = (Integer)field1; num++; this.field1=(A)num; }else if(field1 instanceof String){ int num = Integer.parseInt((String)field1); num++; Integer temp = num; this.field1=(A)temp; }else{ this.field1 = field1; } } public B getFiled2() { return filed2; } public void setFiled2(B filed2) { this.filed2 = filed2; } public C getField3() { return field3; } public void setField3(C field3) { this.field3 = field3; } }
package com.inspur.fangxing; public class DemoMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //在泛型声明后,在调用类型时才确定 MyClass<Integer, Float, String> mc = new MyClass(); mc.setField1(3); mc.setFiled2(12.3f); mc.setField3("abc"); //取数据的时候也确定类型 System.out.println(mc.getField1()); //在JDK1.8之后才可以用 //MyClass<?,?,?> mc = new MyClass<>(); } }
注解:
1. java.lang包是java的基础系统工具包(默认加载的包)
2.(1)注解是一种特殊的接口,继承了Annotation接口,但不可以写实现类。用来标识类或接口中的元素的作用或功能等含义( 不能直接使用注解类,用的是注解标签)。通过别的类添加注解,并且通过反射读取注解来完成特定的任务(注解所标识的功能或者需求)。
--------可以用来替代XMl配置描述文件
(2)注解的位置:
- MyAnnotation.java
-
package com.inspur; import java.lang.annotation.*; public @interface MyAnnotation { }
- MyClass.java
-
package com.inspur; //类 @MyAnnotation public class MyClass { //属性 @MyAnnotation public String name; //构造 @MyAnnotation public MyClass(){ } //方法 @MyAnnotation public void show(){ } //参数 public void method(@MyAnnotation int num){ } }
3.三种注解可以使用的级别:第一个是源代码时,第二个是编译时,第三个是运行时
4.Filed:属性。
5.设置注解的级别:例是运行时。默认值是value
6.
(1)student.java
package com.inspur.demo2; public class Student { public String name="小明";//访问修饰符,类型和属性名 public static int age=20; public Student(){ //访问修饰符,名,并且可以用来创建对象 } public Student(String name){ this.name=name; } public void clean(){ //访问修饰符,返回类型,名, 方法体 System.out.println(this.name+"扫地中"); } }
(2)DemoMain1.java:主要是获得属性。方法和构造在反射中。
package com.inspur.demo2; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Arrays; public class DemoMain1 { public static void main(String[] args) { try { Class c = Student.class; // 属性field Field field = c.getField("name"); System.out.println(field); // getModifiers得到name的访问修饰符,Modifier.toString()转化为人可以识别的字符串形式 // 1.可读 2.可写 3.可读写 4.只读 System.out.println(Modifier.toString(field.getModifiers())); System.out.println(field.getType()); // 返回类型对象 System.out.println(field.getType() == String.class); // 这里field.get(new Student("王五" ))的构造函数 String name = (String) field.get(new Student()); ------ get()方法是得到属性值 System.out.println(name); System.out.println("------------"); Field fieldAge = c.getField("age"); System.out.println(fieldAge.getType() == Integer.class); System.out.println(fieldAge.getType() == int.class); // 如果判断是不是int类型,则: if (fieldAge.getType() == int.class || fieldAge.getType() == Integer.class) { System.out.println(fieldAge.getName()); // 如果age是static类型则获得属性值为: System.out.println(fieldAge.get(null)); } // 方法method--访问修饰符,返回类型,名称,参数,运行方法 // 构造constructor } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
反射: 注意访问修饰符
1.反射可以读取类中的注解,属性,构造,方法等元素
2.反射:Class类三种获取方式,且程序中唯一
3.承接上文
// 方法method--访问修饰符,返回类型,名称,参数,运行方法 Method method =c.getMethod("clean", String.class,int.class); System.out.println(Modifier.toString(method.getModifiers())); System.out.println(method.getReturnType()); System.out.println(method.getName()); System.out.println(Arrays.toString(method.getParameterTypes())); //invoke()调用方法 method.invoke(new Student(), "字符串",20);
// 构造constructor--修饰符,名,参数,运行构造对象 Constructor cons = c.getConstructor(String.class); System.out.println(Modifier.toString(cons.getModifiers())); System.out.println(cons.getName()); System.out.println(Arrays.toString(cons.getParameterTypes())); Object obj = cons.newInstance("小黑"); System.out.println(obj); Field field = c.getField("name"); System.out.println(field.get(obj)); field.set(obj, "小邓"); System.out.println(field.get(obj));
4.反射实例;
(1)Book.java
package com.inspur.demo3; public class Book { private String name; private float price; public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String toString(){ return this.name+","+this.price; } }
(2)DemoMain.java
package com.inspur.demo3; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class DemoMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str="name=lisi&sex=men&age=10"; //String str="name=海明威&price=10.0"; Map<String,String> map = new HashMap<String,String>(); String[] first = str.split("&");; for(String tempStr:first){ String [] second = tempStr.split("=",2); map.put(second[0], second[1]); } /*User user = new User(); user.setName(map.get("name")); user.setSex(map.get("sex")); user.setAge(Integer.parseInt(map.get("age"))); System.out.println(user);*/ //用反射的方法 String className="com.inspur.demo3.User"; Object obj = ObjectUtil.getObject(className,map); System.out.println(obj); } }
(3)ObjectUtil.java
package com.inspur.demo3; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; import java.util.Set; public class ObjectUtil { public static Object getObject(String className,Map<String,String> map) { try { Class c = Class.forName(className); Object obj = c.newInstance(); //遍历map集合,获取参数的key和value两个值 Set<String> keySet = map.keySet(); for(String fieldName :keySet){//fieldName即map的key String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); String setMethodName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); Method getMethod = c.getMethod(getMethodName, null); Method setMethod=c.getMethod(setMethodName, getMethod.getReturnType()); //这样写获得不到属性,因为属性是私有的 /*Field field=c.getField(fieldName); if(field.getType()==int.class||field.getType()==Integer.class){ setMethod.invoke(obj, Integer.parseInt(map.get(fieldName))); } else if(field.getType()==float.class||field.getType()==Float.class){ setMethod.invoke(obj, Float.parseFloat(map.get(fieldName))); }else{ setMethod.invoke(obj, map.get(fieldName)); }*/ if(getMethod.getReturnType().getName()=="int"||getMethod.getReturnType().getName()=="Integer"){ setMethod.invoke(obj, Integer.parseInt(map.get(fieldName))); }else if(getMethod.getReturnType().getName()=="float"||getMethod.getReturnType().getName()=="Float"){ setMethod.invoke(obj, Float.parseFloat(map.get(fieldName))); }else{ setMethod.invoke(obj, map.get(fieldName)); } } return obj; } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
(4)User.java
package com.inspur.demo3; public class User { private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString(){ return this.name+","+this.sex+","+this.age; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步