java反射系列五之获取类的完整结构

代码示例

Person类

package reflect;

@MyAnnotation(value = "guozi")
public class Person extends Creature<String> implements Comparable,MyInterface{
    public String name;
    private int age;
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @MyAnnotation(value = "123")
    public void show() {
        System.out.println("我是巫妖果子");
    }
    private void display(String nation) throws Exception{
        System.out.println("我的国籍是: "+nation);
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        return 0;
    }
    class Bird{

    }
}

Person的父类

package reflect;

public class Creature<T> {
    public double weight;

    public void breath() {
        System.out.println("呼吸!");
    }
}

Person实现的接口

package reflect;

import java.io.Serializable;

public interface MyInterface extends Serializable{

}

注释

package reflect;

import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
}

有了这些"复杂"条件,我们可以:

获取属性  属性类型  属性修饰权限

package reflect;

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

public class TestFiled {
    public static void main(String[] args) {
        TestFiled t = new TestFiled();
        t.test();
        t.test1();
    }
    public void test() {
        Class clazz = Person.class;
        //1.getFields():只能获取到运行时类中及其父类中声明为public的属性
        Field[] fields = clazz.getFields();
        for(int i= 0; i<fields.length; i++) {
            System.out.println(fields[i]);
        }
        System.out.println();
        //2.getDeclareFields():获取运行时类本身声明的所有属性
        Field [] fields1 = clazz.getDeclaredFields();
        for(Field f:fields1) {
            System.out.println(f.getName());
        }
    }
    //获取对应的运行时类的属性
    public void test1() {
        Class clazz = Person.class;
        //得到运行时类的声明属性
        Field [] fields1 = clazz.getDeclaredFields();
        for(Field f:fields1) {
            //1.获取每个属性的权限修饰符
            //0代表default修饰符  1代表public修饰符   2 代表private修饰符
            int i = f.getModifiers();
            //将代表修饰符的数字转化成字符
            String str1 = Modifier.toString(i);
            System.out.print(str1+" ");
            //2.获取属性的类型
            Class type = f.getType();
            System.out.print(type.getName()+" ");
            //3.获取属性名
            System.out.println(f.getName());
        }
    }
}

待续...

原文地址:https://www.cnblogs.com/zjm1999/p/10340191.html

时间: 2024-08-13 15:39:25

java反射系列五之获取类的完整结构的相关文章

创建类对象并获取类的完整结构

创建类的对象:条用Class对象的newInstance方法 1.类必须有一个无参构造器 2.类的构造器的访问权限需要足够. 没有无参构造器也能创建: 1.通过Class类的getDeclaredConstructor取得本类的指定形参类型的构造器 2.向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需要的各个参数 3.在Constructor类中存在一个方法public newInstance 运行时类调用的空参构造器

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 java.lang.reflect.Field使用 Field. 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String name);      返回一个 Fiel

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

Java之反射机制三:获取类的方法

一.实体类BigDog.java package reflex;public class BigDog extends Dog { private Integer age; public String name; public BigDog(){} private void getDog(){} private BigDog(Integer age, String name) { this.age = age; this.name = name; } public String getName(

通过反射来获取对应运行时类的完整结构

Class 对象可以调用其方法获取以下这些类的对象,这些类型分别对应着运行时类的某个结构:Field.Method.Constructor.Superclass.Interface.Annotation 通过这些类的对象,可以获取对应运行时类的: 实现的所有接口 所继承的父类 所有构造器 所有方法 所有属性 泛型 注解 package com.cdf.reflection; import java.lang.annotation.Annotation; import java.lang.refl

java 反射技术---- class类名获取属性

getFields()   -----------    获取类的.父类的所有public 属性: getDeclaredFields() ----------- 获取类的所有public .protected .private 属性: 那么根据API 类是获取不到父类的protected.private 属性的,如果要获取那么需要通过父类使用反射.

java反射系列一

一.概念认知 1.1  ●Java ReflectionReflection (反射)是被视为动态语言的关键, 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息, 并能直接操作任意对象的内部属性及方法 1.2 ●Java反射机制提供的功能?在运行时判断任意一 个对象所属的类 ?在运行时构造任意-个类的对象?在运行时判断任意一个类所具有的成员变量和方法 ?在运行时调用任意个对象的成员变量和方法 ?生成动态代理 1.3  Java反射机制研究及应用●反射相关的主要API

{Java初级系列三}----面向对象和类

一:面向对象----Object 本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授<Java核心技术>,在此感谢老师! 在Java中引入了对象和类的概念 对象是一个变量--------具体的东西: 类就是类型(是规范,是定义),从万千对象中抽取共性: 类规定了对象应该有的属性内容和方法: 对象就是类的具体实现,是活生生的: 例如:土豆丝菜谱是类,一盘土豆丝就是对象 从程序员的发展角度来理解,OO-Oriented Object是对OP—Oriented Procedur

反射技术的入口 获取类的Class信息

package com.sxt.reflect; import com.sxt.reflect.entity.Student; /* * 获取类的Class信息 */ public class TestReflect { public static void main(String[] args) throws Exception { //方式一 Class.forName() Class<?> clazz = Class.forName("com.sxt.reflect.entit