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; } }