day10 反射2

父类:

package com.atguigu.java1;

import java.io.Serializable;

/**
* @author shkstart
* @create 2019 下午 3:12
*/
public class Creature<T> implements Serializable {
private char gender;
public double weight;

private void breath(){
System.out.println("生物呼吸");
}

public void eat(){
System.out.println("生物吃东西");
}

}

 

 people类:

package com.atguigu.java1;

/**
* @author shkstart
* @create 2019 下午 3:12
*/
@MyAnnotation(value="hi")
public class Person extends Creature<String> implements Comparable<String>,MyInterface{

private String name;
int age;
public int id;

public Person(){}

@MyAnnotation(value="abc")
private Person(String name){
this.name = name;
}

Person(String name,int age){
this.name = name;
this.age = age;
}
@MyAnnotation
private String show(String nation){
System.out.println("我的国籍是:" + nation);
return nation;
}

public String display(String interests,int age) throws NullPointerException,ClassCastException{
return interests + age;
}


@Override
public void info() {
System.out.println("我是一个人");
}

@Override
public int compareTo(String o) {
return 0;
}

private static void showDesc(){
System.out.println("我是一个可爱的人");
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}

接口:

package com.atguigu.java1;

/**
* @author shkstart
* @create 2019 下午 3:15
*/

public interface MyInterface {
void info();
}

 

注解

package com.atguigu.java1;

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

import static java.lang.annotation.ElementType.*;

/**
* @author shkstart
* @create 2019 下午 3:19
*/
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";

}

 

 

/**
* 获取当前运行时类的属性结构
*/
public class FieldTest {

@Test
public void test1(){

Class clazz = Person.class;

//获取属性结构
//getFields():获取当前运行时类及其父类中声明为public访问权限的属性
Field[] fields = clazz.getFields();
for(Field f : fields){
System.out.println(f);
}
System.out.println();

//getDeclaredFields():获取当前运行时类中声明的所有属性。(不包含父类中声明的属性)
Field[] declaredFields = clazz.getDeclaredFields();
for(Field f : declaredFields){
System.out.println(f);
}
}

}

 

 

调用运行时类中指定的结构:属性、方法、构造器

/*
如何操作运行时类中的指定的属性 -- 需要掌握
*/
@Test
public void testField1() throws Exception {
Class clazz = Person.class;

//创建运行时类的对象
Person p = (Person) clazz.newInstance();

//1. getDeclaredField(String fieldName):获取运行时类中指定变量名的属性
Field name = clazz.getDeclaredField("name");    //开发常用

//2.保证当前属性是可访问的
name.setAccessible(true);
//3.获取、设置指定对象的此属性值
name.set(p,"Tom");

System.out.println(name.get(p));
}

/*
★★★如何操作运行时类中的指定的方法 -- 需要掌握
*/
@Test
public void testMethod() throws Exception {

Class clazz = Person.class;

//创建运行时类的对象
Person p = (Person) clazz.newInstance();

/*
1.获取指定的某个方法
getDeclaredMethod():参数1 :指明获取的方法的名称 参数2:指明获取的方法的形参列表
*/
Method show = clazz.getDeclaredMethod("show", String.class);   //参数2:叫show的方法可能有很多,so要挑选自定义的带哪种参数的方法
//2.保证当前方法是可访问的
show.setAccessible(true);

/*
3. 调用方法的invoke():参数1:方法的调用者 参数2:给方法形参赋值的实参                       //invoke:调用。
invoke()的返回值即为对应类中调用的方法的返回值。
*/
Object returnValue = show.invoke(p,"CHN");    //           原来的正向调用(正射)方法:String nation = p.show("CHN");
System.out.println(returnValue);

 

System.out.println("*************如何调用静态方法*****************");

// private static void showDesc()

Method showDesc = clazz.getDeclaredMethod("showDesc");         //showDesc为person类中方法名
showDesc.setAccessible(true); 
//如果调用的运行时类中的方法没有返回值,则此invoke()返回null
// Object returnVal = showDesc.invoke(null);
Object returnVal = showDesc.invoke(Person.class);
System.out.println(returnVal);//       返回null

}

 

 

 

/*
newInstance():调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。

要想此方法正常的创建运行时类的对象,要求:
1.运行时类必须提供空参的构造器。
2.空参的构造器的访问权限得够。通常,设置为public。


在javabean中要求提供一个public的空参构造器。原因:
1.便于通过反射,创建运行时类的对象
2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器

*/

/*
如何调用运行时类中的指定的构造器              开发中不常用,常用的是:newInstance()不过jdk9弃用了这玩意。。。。。。
*/
@Test
public void testConstructor() throws Exception {
Class clazz = Person.class;

//private Person(String name)
/*
1.获取指定的构造器
getDeclaredConstructor():参数:指明构造器的参数列表
*/

Constructor constructor = clazz.getDeclaredConstructor(String.class);

//2.保证此构造器是可访问的
constructor.setAccessible(true);

//3.调用此构造器创建运行时类的对象
Person per = (Person) constructor.newInstance("Tom");
System.out.println(per);

}

}

 

posted @ 2020-09-04 10:43  Light光音  阅读(102)  评论(0编辑  收藏  举报