java基础--接口与反射总结

一、接口

  1. 接口中所有的方法默认public static final,不必再写。
  2. 接口中可以定义常量,但不能含有实例域。在java SE8之前,不能在接口中实现方法。
  3. 一个类可以实现多个方法implements 接口1,接口2。。。多个接口之间用“,”隔开。
  4. 克隆:要实现克隆先实现Cloneable接口,重新定义clone方法,并指定public修饰符。

    默认clone是浅克隆,要实现深克隆需要自己重写clone。

  5. 所有的数组类型都有一个public的clone方法。

二、反射

  1. 概念:能够分析类能力的程序称为反射,能动态操纵java代码程序。
  2. java运行时,系统始终为所有对象维护一个被称为运行时的类型标识。保存这些信息的类称为Class
  3. 获取Class方法:对象.getClass() 、Class.forName(对象名) 、类型.class

    一个Class实际上表示一个类型,这个类型未必是一个类,它实际上是一个泛型。

    虚拟机为每个类型管理一个Class对象。可以通过newInstance()动态创建一个类的实例。

  4. Filed、Method、Constructor这三个类都有一个getName方法,返回对应的名称

    都有一个getModifiers方法,返回修饰符使用情况,可以利用Modifier类中isPublic,这种判断。也可以toString打印出来。

  5. 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();
        }

    }
}
时间: 2024-11-03 20:50:42

java基础--接口与反射总结的相关文章

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi

Java 基础篇之反射

Java 基础篇之反射 反射# 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象# 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使用 Class 类的 forName(String clazzName) 静态方法.字符串参数的值是某个类的全限定类名,必须包含完整的包名 调用某个类的 class 属性 调用某个对象的 getClass() 方法.该方法是 java.lang.Object 类中的一个方

学习Spring必学的Java基础知识(1)----反射

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性

学习Spring必学的Java基础知识(1)----反射(转)

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123

java基础11(反射)

1.类加载器 a.类的加载: 定义:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 一个类在加载过程中的三部曲: A.加载 : 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象. B.连接: 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 C.初始化 b.类的加载时机:

【Java基础总结】反射

1. 什么是反射 Class.Method.Field.Constructor,它们是反射对象.它们是类.方法.成员变量.构造器,在内存中的形式. 也就是万物皆对象!类是类型.方法是类型.成员变量是类型.构造器也是类型. 可以把Class当作类的元神:Method是方法的元神:Field是成员的元神:Constructor是构造器的元神. 得到了元神就可以来操作宿主. 2. 获取Class类的对象 Class表示一个类型,即描述类的类型. * 类名.class:Class c1 = Object

JAVA基础接口集合框架

接口--------------------------------------------------------------------------------一.接口(是一种规范)1.接口名/接口文件与类类似,也是用.java文件编写2.关键字 interface 接口名命名规范与类名相同 习惯上可以使用I开头表示3. 接口额访问修饰符只能使用public和default修饰不能使用private和protected在接口中默认缺省为public4.接口中的所有属性只能为公开的静态的常量而

Java基础知识总结--反射

反射:在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每一个对象所属的类.虚拟机利用运行时类型信息选择相应的方法执行. Java反射机制是在系统运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.使用Class类中的方法,可以获取到每一个字节码文件对应的Class类

Java基础-接口中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,

36.中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产.请编写一个java应用程序描述上述的体制现象. 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,该抽象类中有个“安 全生产”的抽象方法:abstract void safetyInProduction() (