加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java基础--接口与反射概括

发布时间:2021-11-15 15:31:33 所属栏目:教程 来源:互联网
导读:一、接口 接口中所有的方法默认public static final,不必再写。接口中可以定义常量,但不能含有实例域。在Java SE8之前,不能在接口中实现方法。一个类可以实现多个方法implements 接口1,接口2。。。多个接口之间用,隔开。克隆:要实现克隆先实现Cloneabl

一、接口
 
接口中所有的方法默认public static final,不必再写。接口中可以定义常量,但不能含有实例域。在Java SE8之前,不能在接口中实现方法。一个类可以实现多个方法implements 接口1,接口2。。。多个接口之间用“,”隔开。克隆:要实现克隆先实现Cloneable接口,重新定义clone方法,并指定public修饰符。
 
默认clone是浅克隆,要实现深克隆需要自己重写clone。所有的数组类型都有一个public的clone方法。
 
二、反射
 
概念:能够分析类能力的程序称为反射,能动态操纵java代码程序。java运行时,系统始终为所有对象维护一个被称为运行时的类型标识。保存这些信息的类称为Class
 
获取Class方法:对象.getClass() 、Class.forName(对象名) 、类型.class
 
一个Class实际上表示一个类型,这个类型未必是一个类,它实际上是一个泛型。
 
虚拟机为每个类型管理一个Class对象。可以通过newInstance()动态创建一个类的实例。
 
Filed、Method、Constructor这三个类都有一个getName方法,返回对应的名称
 
都有一个getModifiers方法,返回修饰符使用情况,可以利用Modifier类中isPublic,这种判断。也可以toString打印出来。
 
Field类:用于描述类的域
 
getFileds()返回一个Field对象的数组,包括这个类或者超类的公有域
 
  getFiled(name) 根据名称返回对应的域
 
  getDeclaredFields()返回Field对象数组,包括这个类的全部域
 
  getType() 返回描述域所属类型的Class对象
 
  SetAccessible(true) 屏蔽java语言的访问检查,使得私有属性也可以被查询和设置
 
  get(obj) set()
 
6. Method、Constructor与Field类似。
 
  获取方法指针:Method m = obj.class.getMethod(方法名)
 
  调用方法:  String n = m.invoke(obj,...参数)
 
  注意:如果是调用静态方法,则第一参数为空
 
以下附录一个小例子:
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
import java.lang.Double;
/**
 * Created by cnslp on 2017/4/22.
 */
public class ReflectionTest {
 
    public static void printfiled(Class c){
        Field[] fields = c.getDeclaredFields();
        for (Field f : fields){
            String modifier = Modifier.toString(f.getModifiers());
            if (modifier.length()>0){
                System.out.print(modifier+" ");
            }
            Class type = f.getType();
            System.out.print(type.getName()+" ");
            System.out.print(f.getName());
            System.out.println(";");
        }
        System.out.println();
    }
    public static void printConstruct(Class c){
        Constructor[] constructors = c.getConstructors();
        for (Constructor constructor : constructors){
            String modifier = Modifier.toString(constructor.getModifiers());
            if (modifier.length()>0){
                System.out.print(" "+modifier+" ");
            }
            String name = constructor.getName();
            System.out.print(name+"(");
            Class[] paramTypes = constructor.getParameterTypes();
            int j=0;
            for (Class cc : paramTypes){
                if (j>0)
                    System.out.print(",");
                System.out.print(cc.getName());
                j++;
            }
            System.out.println(");");
        }
        System.out.println("");
    }
    public static void printMethod(Class c){
        Method[] methods = c.getMethods();
        for (Method method : methods){
            String modifier = Modifier.toString(method.getModifiers());
            if (modifier.length()>0){
                System.out.print(" "+modifier+" ");
            }
            String name = method.getName();
            System.out.print(name+"(");
            Class[] paramTypes = method.getParameterTypes();
            int j=0;
            for (Class cc : paramTypes){
                if (j>0)
                    System.out.print(",");
                System.out.print(cc.getName());
                j++;
            }
            System.out.println(");");
        }
    }
    public static void main(String[] args) {
        String name;
        if (args.length>0)
            name = args[0];
        else {
            Scanner in = new Scanner(System.in);
            System.out.println("please input a class name");
            name = in.nextLine();
        }
        try {
            Class c = Class.forName(name);
            Class father = c.getSuperclass();
            String modefiers = Modifier.toString(c.getModifiers());
            System.out.println(modefiers+" class "+c.getName()+" extends "+father.getName()+"{");
            printfiled(c);
            printConstruct(c);
            printMethod(c);
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
    }
}

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读