我的笔记 泛型和反射机制

    xiaoxiao2021-04-14  73

    由于类型转换的错误,java虚拟机在编译时不会报错,二在运行时报异常,所以安全隐患非常明显,为此我们需要用泛型来弥补这一问题。有了泛型,我们在集合类中添加对象的时候,就不用在强转了。     反射机制是将泛型固定的累的所有方法和成员全部可以显示出来,以供程序员可以确定程序的编写是否有无的机制 示例代码:反射机制 import java.lang.reflect.Method; public class fanshe { public static void main(String[] args)  { //Bh<String> hw1=new Bh<String>("货物"); //Bh<Integer> hw2=new Bh<Integer>(123); Bh<WJ> hw3=new Bh<WJ>(new WJ()); hw3.lxmc(); } } class WJ { public void wan() { System.out.println("正在玩游戏"); } public int jiafa(int a,int b) { return a+b; } } class Bh<L> { private L l; Bh(L l) { this.l=l; } public void lxmc() { System.out.println("类型是"+l.getClass().getName());//取类型名称的函数 Method[] a=l.getClass().getDeclaredMethods();//用属猪来接收类中方法的数量 for(int i=0;i<a.length;i++) //逐一输出方法名称 { System.out.println("函数名为"+a[i].getName()); } } } 示例代码  泛型 import java.util.*; public class fangxing { public static void main(String[] args) { //Hashtable arr=new Hashtable(); ArrayList<LS> arr=new ArrayList<LS>();//如果没有<>下面的YL yl=()arr.get(0);不会报错 LS ls1=new LS("薯片",6); //同过泛型将类型定下来 arr.add(ls1); LS ls2=(LS)arr.get(0); //YL yl=(YL)arr.get(0); } } class LS { private String name; private float jiage; LS(String name,float jiage) { this.name=name; this.jiage=jiage; } } class YL { private String name; private float jiage; private String yanse; YL(String name,float jiage,String yanse) { this.name=name; this.jiage=jiage; this.yanse=yanse; } } 反射 Reflection n Reflection  是  Java  程序开发 语言的特征之一, 它允许运行中的  Java  程序对自身 进行检查,或 者说“自审” 并能直接操作程序 的内部属性 例如,使用它能获得  Java  类中各 成员的名称并 显示出来。<迟绑定> n JavaBean   是  reflection  的实 际应用之一,它能 让一些工具可视化的操作软件组 件。这些工具通 过  reflection  动态的载入并取 得  Java  组件 (类) 的属性。 n n 反射机制是如今很多流行框架的 实现基础,其中 包括 Spring、Hibernate ( ORMapping ) 反射常用的类 n 包: java.lang.reflect n Class Class   类的实例表示正在运 行的  Java  应用程 序中的类和接口 n Method 提供关于类或接口上单独某 个方法(以及如何 访问该方法)的信息 n Field :提供有关类或接口的单个字 段的信息,以及对 它的动态访问权限 n Array :提供了动态创建和访问  Java  数组的方法 Class 类主要方法 n static   Class<?>  forName (String   className )   返回与带有给定字符串名的类或接口相关联的  Class   对象 n Field[]  getDeclaredFields ()   返回  Field   对象的一个数组,这些对象反映此  Class   对象所表示的类或接口所声明的所有字 段。 n Method[]  getDeclaredMethods ()   返回  Method   对象的一个数组,这些对象反映 此  Class   对象表示的类或接口声明的所有方 法,包括公共、保护、默认(包)访问和私有 方法,但不包括继承的方法 n Boolean  isInstance (Object   obj )   判定指定的  Object   是否与此  Class   所表示的 对象赋值兼容 n   Object  newInstance ()   创建此  Class  对象所表示的类的一个新实例 package com.eduask.reflect; import java.lang.reflect.Method; public class Test {     /**      * @param args      *       * 通过反射获取class的方式有三种      * 第一种方法通过 object的getClass方法      *       * 第二种方法      * 直接类.class      *       * 第三种方法      * 通过class.forName("全类名")来获取      *       * 通常我们使用第三种方法,      *       *       *       *       *       */     public static void main(String[] args) {         // TODO Auto-generated method stub         Person p=new Person();//对象 //        Class pc=p.getClass();//获取到的是Class也就是编译好的.class文件         if(p instanceof Person ){             System.out.println("p 是 person的实例");         }else{             System.out.println("p 不是 person的实例");         }                                    //lei1  lei 2 都是 leiBaBa 的子类 都可以用leiBaBa里面的 m1方法,但是android           // if( this instanceof  lei1){ //                a操作 //                }                                     //         //        Person p2=new Person(); //        Class pc2=p2.getClass(); //         //        System.out.println(p==p2);    //false //        System.out.println(pc==pc2);   //true //         //         //        Class pc3=Person.class; //        System.out.println(pc3==pc2);                           try {             Class pc4=Class.forName("com.eduask.reflect.Person");             try {                 Person p6=(Person) pc4.newInstance();                 p6.m2();                                               } catch (InstantiationException e) {                 // TODO Auto-generated catch block                 e.printStackTrace();             } catch (IllegalAccessException e) {                 // TODO Auto-generated catch block                 e.printStackTrace();             }                                                     //            System.out.println(pc4==pc2); //            Field[] fss=pc4.getDeclaredFields(); //            int sized=fss.length; //            System.out.println("============length===>"+sized); //            for(int i=0;i<sized;i++){ //                Field f=fss[i]; //                System.out.println(f); //            }             Method[] ms=pc4.getDeclaredMethods();             int sized2=ms.length;             System.out.println("============length===>"+sized2);             for(int i=0;i<sized2;i++){                 Method m=ms[i];                 System.out.println(m);             }         } catch (ClassNotFoundException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }                                                  } } 通过反射建立JDBC创建一张表 package com.eduask.javaSE.reflectDemo; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import org.junit.Test; /**  * 实现功能:通过反射去数据库中创建相应表  * @author Administrator  *  */ public class HbTools { @Test public void tester() throws ClassNotFoundException, SQLException{ String className = "com.eduask.javaSE.reflectDemo.MyStudent"; createTable(className); } /**  *   * @param className  * @param obj  */ public void save(String className,Object obj){ } /**  * create table table_name(fieldName fieldType,fieldName fieldType,...)  *   *      class User{ int id;String name }  *   *   *   * @param className  * @throws SQLException   * @throws ClassNotFoundException   */ public void createTable(String className) throws ClassNotFoundException, SQLException{ //初始化sql语句 String sql = "create table "; //为sql添加表名(com.eduask.javaSE.reflectDemo.User)Math.radom():[0,1) String tableName = className.substring(className.lastIndexOf('.')+1); sql += tableName; //添加括号 sql += "("; //为sql添加字段名跟字段类型 Class clazz = Class.forName(className); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { String fieldName = field.getName(); sql += fieldName+" "; //获取字段类型 String fieldType = field.getType().getSimpleName(); //将Java的数据类型转换为oracle数据库的数据类型 //数值类型 if("int".equals(fieldType) || "float".equals(fieldType) || "double".equals(fieldType)){ sql += "NUMBER,"; }else if("String".equals(fieldType)){//字符类型 sql += "VARCHAR2(20),"; }else if("Date".equals(fieldType)){//日期 sql += "DATE,"; }else{ System.out.println("本软件不支持的数据类型。"); } } //去除最后的逗号abc [0,2) sql = sql.substring(0,sql.length()-1); //添加括号 sql += ")"; System.out.println("sql="+sql); //连接数据库,根据连接创建Statement,通过Statement执行sql,关闭连接 Connection conn = getConn(); Statement state = conn.createStatement();  state.execute(sql); conn.close(); } /**  * 获取数据库连接  * @return  * @throws ClassNotFoundException   * @throws SQLException   */ public Connection getConn() throws ClassNotFoundException, SQLException{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl110","scott","tiger"); return conn; } }
    转载请注明原文地址: https://ju.6miu.com/read-669576.html

    最新回复(0)