添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
任性的紫菜汤  ·  System.IO.FileLoadExce ...·  1 年前    · 
慷慨的枕头  ·  node-sass 安装失败 ...·  2 年前    · 
逃跑的生菜  ·  ZLib ...·  2 年前    · 
枚举类型通常包含一组常量数据值,适合某种事物固定的构成结构(如季节由’’四季组成)。
  • 枚举类型可以实现某个接口,但是枚举类型不能继承其他类同时枚举类型也不能被其他类所继承。
  • 枚举类型可以定义非抽象方法,方法必须在所有枚举常量之后;枚举类型中也可以定义内部类及内部接口。
  • 枚举类型的定义

    public enum SignalLamp{

    /* 枚举中的常量 */

    RED,

    GREEN,

    BLUE;

    }

    枚举常用方法

    public final int compareTo(E o) 比较枚举值大小,小于参数返回负数,大于参数返回正数,相等返回0

    public final String name() 获取枚举的名称字符串形式

    public final int ordinal() 获取枚举所在枚举集合中位置的索引,索引默认从0开始

    public static E[ ] values() 获取所有枚举数组形式

    public static E valueOf(String name)根据参数获取枚举常量对象

    总结,想定义一组常量表示某种特定事物时,可以使用枚举。

    反射概述

    Java中的反射编程是通过在JVM运行时获取某个类型的字节码(Class)对象,从而利用其反向获取此类型定义的内部信息实现编程的一种机制。

    反射编程通常属于非常规操作,存在一定的安全问题。

    反射编程在设计开发工具框架时使用较多,诸如spring,hibernate等java应用框架技术中使用比较频繁。

    反射编程比较普通的编程方式执行效率相对要低。

    反射编程常用组件

    javalang.Class 字节码类型

    java.lang.reflect.Constructor 构造器类型

    java.lang.reflect.Method 方法类型

    java.lang.reflect.Field 属性类型

    java.lang.reflect.Modifier 访问修饰符类型

    Class类

    Class类的实例表示正在运行的Java应用程序中的类和接口,是字节码的实例。Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。任何一个java对象都可以获得一个和其相关的Class对象。利用Class对象可以获得此类的信息;所有同一类型的实例共享一个字节码对象

    public static Class<?> forName(String className) //表示给定一个字符串,这个字符串是某个引用类的字符串描述,它包含整个类的绝对路径包名,加载此类会返回一个字节码对象

    public Field getField(String name) //返回一个Field实例,返回一个字段

    public Field[] getField() //返回所有字段

    public Field getDeclaredField(String name) //按照给定名称获取一个私有字段

    public Method getMethod(String name,Class<?>... parameterTypes) //获取类中的方法,第一个参数是名称,第二个是字节码类型,第三个是可变数组

    public Method[] getMethods() //获取类中的所有方法

    public Constructor<T> getConstructor(Class<?>... parameterTypes) //获取类中的构造器

    public Constructor<?>[ ] getConstructors() //获取所有构造器

    public native int getModifiers() //获取当前类的访问标识符,native表示本地方法

    public ClassLoader getClassLoader() //获取类加载器

    Constructor类

    Constructor类表示某个类的构造方法实例类型。利用Constructor可以创建Constructor所在类的实例并对此类进行初始化等操作。

    Constructorm没有公有的构造方法,所以不能实例化它,可以通过某个类的Class实例获得一个Constructor实例

    public T newInstance(Object...initargs) //获取某一个对象类型的实例

    public void setAccessible(boolean flag) //设置构造器可访问或者不可访问

    public int getModifiers() //获取访问级别

    public Parameter[] getParameters() //获取当前构造器的参数列表

    public int getParameterCount() //返回参数的个数

    Field类

    Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

    Field提供了对字段的反射操作动作,使编程中访问属性字段更加灵活。


    /**
    * 将reflectTask 应用程序导入Eclipse 集成开发工具中,调整导入可能产生的错误(jar 文件导入路径可能发生错误);
    * 按照以下所述完成实践任务.程序中Env 类为读取../conf/dbconf.properties 属性文件的组件, 应在Env中编写
    * 读取dbconf.properties 文件的功能实现代码.
    *
    * 程序中DataSourceSupport 类是为程序提供数据源的组件,其中私有方法getDataSource 返回BasicDataSource
    * 类型的数据源对象; DataSourceSupport 类中的成员属性,构造方法及getDataSource 皆是私有的访问级别,不能在
    * 此类之外为私有属性赋值, 创建此类的对象和调用私有的getDataSource 方法.
    * 为了能够实现对DataSourceSupport 的创建,为私有属性赋值并实现调用getDataSource私有方法. 定义了
    * ReflectSupport 类, 此类是本任务最核心的编码任务, 在ReflectSupport类中应利用java反射编程机制, 实现
    * 以下操作:
    * 1 获取ReflectSupport 字节码(Class 实例)对象;
    * 2 获取ReflectSupport 的构造器, 应在运行时动态改变ReflectSupport构造器的访问级别;
    * 3 利用构造器创建ReflectSupport 实例;
    * 4 为ReflectSupport实例的私有属性赋值(属性值来源于Env读取的dbconf.properties文件配置)
    * 5 获取getDataSource 方法实例,并修改其访问级别
    * 6 实现动态调用getDataSource私有方法返回BasicDataSource对象
    *
    * 在TestReflect类中的main方法中编写测试代码,完成上述任务的测试.
    */

    package com.xzit.db;

    import org.apache.commons.dbcp2.BasicDataSource;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;


    /**
    * 此类实现以反射编程方式提供获取DataSourceSupport实例
    * 为私有属性赋值(属性值来自dbconf.properties 属性文件定义)
    * 实现调用私有方法(方法名称来自dbconf.properties 属性文件定义)
    * @author Administrator
    *
    */
    public final class ReflectSupport {

    /*
    * 请定义一个合适的方法实现功能
    * */
    public static void main(String[] args) {
    try {

    //使用Class类通过反射的方式new一个已有的DataSourceSupport类的对象stuCla
    /**
    * 1 获取ReflectSupport 字节码(Class 实例)对象;
    */
    Class<?> c = Class.forName("com.xzit.db.DataSourceSupport");

    /**
    * 2 获取ReflectSupport 的构造器, 应在运行时动态改变ReflectSupport构造器的访问级别;
    */
    //如果目标类构造器是私有的,那就动态的改变它的访问级别
    Constructor con = c.getDeclaredConstructor();
    con.setAccessible(true);
    //通过newInstance方法new一个DataSourceSupport类的默认构造器,强转成DataSourceSupport类型的对象data
    DataSourceSupport data = (DataSourceSupport) con.newInstance();

    /**
    * 4 为ReflectSupport实例的私有属性赋值(属性值来源于Env读取的dbconf.properties文件配置)
    */
    Env env = new Env(); //实例化Env类
    env.read(); //调用读取配置文件的方法read

    //获取不可见的字段属性
    Field jdbcUrl= c.getDeclaredField("jdbcUrl");
    Field jdbcDriverClass= c.getDeclaredField("jdbcDriverClass");
    Field jdbcUserName= c.getDeclaredField("jdbcUserName");
    Field jdbcPassword= c.getDeclaredField("jdbcPassword");

    /* 运行时动态改变私有字段的访问级别 */
    jdbcUrl.setAccessible(true);
    jdbcDriverClass.setAccessible(true);
    jdbcUserName.setAccessible(true);
    jdbcPassword.setAccessible(true);

    //为私有字段赋值,值取自Env读取的dbconf.properties文件配置
    jdbcUrl.set(data,env.getJdbcUrl());
    jdbcDriverClass.set(data,env.getJdbcDriverClass());
    jdbcUserName.set(data,env.getJdbcUserName());
    jdbcPassword.set(data,env.getJdbcPassword());

    //输出值检验一下:
    System.out.println("jdbcUrl= "+jdbcUrl.get(data));
    System.out.println("jdbcDriverClass= "+jdbcDriverClass.get(data));
    System.out.println("jdbcUserName= "+jdbcUserName.get(data));
    System.out.println("jdbcPassword= "+jdbcPassword.get(data));


    /**
    * 5 获取getDataSource 方法实例,并修改其访问级别
    */
    Method getData = c.getDeclaredMethod("getDataSource");
    getData.setAccessible(true);//运行时更改此方法的访问级别

    /**
    * 6 实现动态调用getDataSource私有方法返回BasicDataSource对象
    */
    BasicDataSource big = (BasicDataSource)getData.invoke(data);
    //返回一个MaxIdle值检验一下确实是调用成功了
    System.out.println(big.getMaxIdle());


    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }





    /**
    * 程序中Env 类为读取../conf/dbconf.properties 属性文件的组件,
    * 应在Env中编写读取dbconf.properties 文件的功能实现代码.
    */

    package com.xzit.db;

    import java.util.Properties;
    import java.util.ResourceBundle;

    /**
    * 此类实现对dbconf.properties 文件信息的读取
    * @author Administrator
    *
    */
    public final class Env extends Properties {
    private String className;
    private String jdbcUrl;
    private String jdbcDriverClass;
    private String jdbcUserName;
    private String jdbcPassword;
    private String actionMethod;

    /*
    * 请编写实现代码
    * */
    public void read(){
    //使用getBundle()方法,读取指定路径下的配置文件
    ResourceBundle resourceBundle = ResourceBundle.getBundle("com.xzit.conf.dbconf");

    //获取资源dbconf中的className字段的值
    className = resourceBundle.getString("className");

    //获取资源dbconf中的jdbcUrl字段的值
    jdbcUrl = resourceBundle.getString("jdbcUrl");

    //获取资源dbconf中的jdbcDriverClass字段的值
    jdbcDriverClass = resourceBundle.getString("jdbcDriverClass");

    //获取资源dbconf中的jdbcUserName字段的值
    jdbcUserName = resourceBundle.getString("jdbcUserName");

    //获取资源dbconf中的jdbcDriverClass字段的值
    jdbcPassword= resourceBundle.getString("jdbcPassword");

    //获取资源dbconf中的actionMethod字段的值
    actionMethod = resourceBundle.getString("jdbcDriverClass");

    }

    public String getClassName() {
    return className;
    }

    public void setClassName(String className) {
    this.className = className;
    }

    public String getJdbcUrl() {
    return jdbcUrl;
    }

    public void setJdbcUrl(String jdbcUrl) {
    this.jdbcUrl = jdbcUrl;
    }

    public String getJdbcDriverClass() {
    return jdbcDriverClass;
    }

    public void setJdbcDriverClass(String jdbcDriverClass) {
    this.jdbcDriverClass = jdbcDriverClass;
    }

    public String getJdbcUserName() {
    return jdbcUserName;
    }

    public void setJdbcUserName(String jdbcUserName) {
    this.jdbcUserName = jdbcUserName;
    }

    public String getJdbcPassword() {
    return jdbcPassword;
    }

    public void setJdbcPassword(String jdbcPassword) {
    this.jdbcPassword = jdbcPassword;
    }

    public String getActionMethod() {
    return actionMethod;
    }

    public void setActionMethod(String actionMethod) {
    this.actionMethod = actionMethod;
    }



    }



    package com.xzit.db;

    import org.apache.commons.dbcp2.BasicDataSource;

    /**
    * 提供获取目标数据源的通用组件
    * @author Administrator
    *
    */
    public class DataSourceSupport{

    private String jdbcUrl;// 连接目标数据源的url
    private String jdbcDriverClass;// 数据源jdbc驱动类名称
    private String jdbcUserName;// 登录数据库的用户名称
    private String jdbcPassword;// 登录数据库用户的密码

    /**
    * 提供返回BasicDataSource对象的方法
    * @return BasicDataSource
    */
    private BasicDataSource getDataSource(){
    BasicDataSource ds = new BasicDataSource();
    ds.setUrl(jdbcUrl);
    ds.setDriverClassName(jdbcDriverClass);
    ds.setUsername(jdbcUserName);
    ds.setPassword(jdbcPassword);
    return ds;
    }
    /**
    * 私有构造器
    */
    private DataSourceSupport(){
    }

    }



    python csv求平均值 python计算csv列平均值

    表格内容大致如下: 一共两列(Year | SIF )Year:2001 -2020目的:求每一年对应的SIF 平均值1 import pandas as pd 2 import numpy as np 4 file = pd.read_csv('csv存放路径') 5 a = [] 7 for year in range(2001,2021): 8 sif

    Java习题四 java例题

    1.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子, 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?解析:用到递归的方法public class Progs1 { public static void main(String[] args){ // int n=10; // System.ou