反射和类操作

1.反射获取类结构信息
在这里插入图片描述

package fan;

public class Javademo extends abstractbase implements fan,server{
    @Override
    public void send() {
        System.out.println();
    }

    @Override
    public void server() {
        System.out.println();
    }
}

package fan;

public class test {
    public static void main(String[] args) {
        Class cl=Javademo.class;
        System.out.println(cl);
        //获取父类包名称
        Package pack=cl.getPackage();
        System.out.println(pack.getName());
        //获取父类信息
        Class ce=cl.getSuperclass();
        System.out.println(ce);
        System.out.println(ce.getName());
        //获取父接口
        Class clazz[]=cl.getInterfaces();
        for(Class temp:clazz){
            System.out.println(temp.getName());
        }
    }
}

2.获得构造方法

package fan;

import java.lang.reflect.Constructor;

public class test {
    public static void main(String[] args) {
        Class cl=people.class;
//        System.out.println(cl);
//        //获取父类包名称
//        Package pack=cl.getPackage();
//        System.out.println(pack.getName());
//        //获取父类信息
//        Class ce=cl.getSuperclass();
//        System.out.println(ce);
//        System.out.println(ce.getName());
//        //获取父接口
//        Class clazz[]=cl.getInterfaces();
//        for(Class temp:clazz){
//            System.out.println(temp.getName());
            Constructor<?>[]  cu=cl.getDeclaredConstructors();//获得所有构造方法
            for(Constructor<?>cons: cu){
                System.out.println(cons);
    
            }
                
        }
    }
}

结果
在这里插入图片描述
获得带参构造方法

package fan;

public class people extends abstractbase implements fan,server{
    private  String name;
    private int age;
    public people(){

    }
    public people(String name,int age){
        this.age=age;
        this.name=name;

    }
    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;
    }

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

    @Override
    public void send() {
        System.out.println();
    }

    @Override
    public void server() {
        System.out.println();
    }
}

package fan;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class cl=people.class;
//        System.out.println(cl);
//        //获取父类包名称
//        Package pack=cl.getPackage();
//        System.out.println(pack.getName());
//        //获取父类信息
//        Class ce=cl.getSuperclass();
//        System.out.println(ce);
//        System.out.println(ce.getName());
//        //获取父接口
//        Class clazz[]=cl.getInterfaces();
//        for(Class temp:clazz){
//            System.out.println(temp.getName());
            Constructor cu=cl.getConstructor(String.class,int.class);//获得带参构造
           Object obj= cu.newInstance("小强",78);//实例化
        System.out.println(obj);

            }

        }

3.利用反射获得类的普通方法
。1.获取全部方法

package fan;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class cl=people.class;

        Method[] method=cl.getMethods();
        for(Method met:method){
            System.out.println(met);

        }
      

            }

        }

结果

"D:\Program Files\Java\jdk1.8.0_161\bin\java.exe" "-javaagent:D:\ruanjian\idea\IntelliJ IDEA 2020.2.2\lib\idea_rt.jar=55776:D:\ruanjian\idea\IntelliJ IDEA 2020.2.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;C:\Users\lyh\IdeaProjects\1111\out\production\1111" fan.test
public java.lang.String fan.people.toString()
public java.lang.String fan.people.getName()
public void fan.people.setName(java.lang.String)
public int fan.people.getAge()
public void fan.people.send()
public void fan.people.setAge(int)
public void fan.people.server()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

Process finished with exit code 0

获得本类方法

package fan;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class cl=people.class;

        Method[] method=cl.getDeclaredMethods();//获得本类方法
        for(Method met:method){
            System.out.println(met);

        }


            }

        }

结果

"D:\Program Files\Java\jdk1.8.0_161\bin\java.exe" "-javaagent:D:\ruanjian\idea\IntelliJ IDEA 2020.2.2\lib\idea_rt.jar=55803:D:\ruanjian\idea\IntelliJ IDEA 2020.2.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;C:\Users\lyh\IdeaProjects\1111\out\production\1111" fan.test
public java.lang.String fan.people.toString()
public java.lang.String fan.people.getName()
public void fan.people.setName(java.lang.String)
public int fan.people.getAge()
public void fan.people.setAge(int)
public void fan.people.send()
public void fan.people.server()

调用方法

package fan;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
        Class cl = Class.forName("fan.people");
        String attribyte = "name";//要执行的类内容;
        String value = "欣欣猪";//要设置的属性内容
        //1.任何情况下如果要想保持类中的属性或者类中的方法都必须保证存在实例化对象,既然不允许导入包,那麽反射
        Object obj = cl.getDeclaredConstructor().newInstance();//调用无参构造实例化
        //2.要想进行方法的调用,就要获得犯法的名称
        String setMethodName = "setName";//方法名称
        Method method = cl.getDeclaredMethod(setMethodName, String.class);//获取指定的方法
        method.invoke(obj, value);//等价于:person.setName(value);
        String getMethodName = "getName";
        Method method1 = cl.getDeclaredMethod(getMethodName);
        System.out.println(method1.invoke(obj));//等价于aperson.getName


    }
        }

结果

"D:\Program Files\Java\jdk1.8.0_161\bin\java.exe" "-javaagent:D:\ruanjian\idea\IntelliJ IDEA 2020.2.2\lib\idea_rt.jar=56054:D:\ruanjian\idea\IntelliJ IDEA 2020.2.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;C:\Users\lyh\IdeaProjects\1111\out\production\1111" fan.test
欣欣猪

Process finished with exit code 0

4.获取类成员

package fan;


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;


public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
    Class<?> cl=Class.forName("fan.people");//获取指定类的class对象
       //获取父类之中的公共成员
        Field[] field=cl.getFields();//获取成员
        for (Field fi:field){
            System.out.println(fi);
        }
        System.out.println("---------------分割线----------");
            //获取子类中的的定义地成员
        Field[] field1=cl.getDeclaredFields();
        for (Field fil:field1){
            System.out.println(fil);
        }


    }
        }



但是Field中还有更重要的3种方法
1.设置成员属性内容
2.获得成员属性内容
3.解除封装setAccessible

package fan;


import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;


public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException, NoSuchFieldException {
    Class<?> cl=Class.forName("fan.people");//获取指定类的class对象
       Object obj=cl.getDeclaredConstructor().newInstance();//实例化对象(分配成员空间)
        Field nameField =cl.getDeclaredField("name");//  获取成员对象
        nameField.setAccessible(true);//,没有封装了
        nameField.set(obj,"欣欣猪");//等价与person对象.name="欣欣猪"
        System.out.println(nameField.get(obj));//等价于person对象.name
        }


    }

在这里插入图片描述
而其中Field在开发中最常用的方是getType()获得成员类型

public class test {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException, NoSuchFieldException {
        Class<?> cl = Class.forName("fan.people");//获取指定类的class对象
        Object obj = cl.getDeclaredConstructor().newInstance();//实例化对象(分配成员空间)
        Field nameField = cl.getDeclaredField("name");//  获取成员对象
        System.out.println(nameField.getType().getSimpleName());

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值