java中的反射暴力破解:创建对象、获取属性、方法等。

反射创建对象:

public class User {

    private String name="小明";
    private int age=10;


    //无参构造器
    public User(){

    }


    public User(String name){
        this.name=name;
    }

    //受保护的构造器:
    private User(String name,int age){
        this.name=name;
        this.age=age;
    }

    @Override
    public String toString() {
        return "User=[" +
                "name='" + name + '\'' +
                ", age=" + age +
                ']';
    }
}
public class reflect_class {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        String classpath="com.hsp.User";

        Class<?> cls = Class.forName(classpath);

        //public的无参构造器;
        Object obj1 = cls.newInstance();
        System.out.println("public的无参构造器:"+obj1);


        //public的有参构造器:先使用构造器:
        Constructor<?> constructor = cls.getConstructor(String.class);
        Object obj2 = constructor.newInstance("shanxi");
        System.out.println("public的有参构造器:"+obj2);

        //prvate的有参构造器:
        Constructor<?> declaredConstructor = cls.getDeclaredConstructor(String.class,int.class);//需要传入对应参数的class
        //对于私有的构造器:可以设置暴力破解的方式:
        declaredConstructor.setAccessible(true);
        Object obj3 = declaredConstructor.newInstance("小明", 18);

        System.out.println("private的有参构造器:"+obj3);
    }
}
public的无参构造器:User=[name='null', age=0]
public的有参构造器:User=[name='shanxi', age=0]
private的有参构造器:User=[name='小明', age=18]

通过反射访问属性:

public class Student {
    private String name;
    public int age;


    public Student(){


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

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {


        String classpth="com.hsp.Student";

        Class<?> cls = Class.forName(classpth);

        //访问public的name属性: 无参构造器:
        Object o = cls.newInstance();
        System.out.println("o的运行类型是:"+o.getClass());

        //getField 只可以得到public修饰的属性:
        Field age = cls.getField("age");
        //设置属性的值:
        age.set(o,18);
        //属性名.get(对象名)
        System.out.println(age.get(o));

        //使用反射的方式得到private的属性; getDeclaredField是可以得到private修饰的属性;

        Field name = cls.getDeclaredField("name");
        name.setAccessible(true);//暴力破解;
        name.set(o,"小花");
        System.out.println(name.get(o));
    }
}
o的运行类型是:class com.hsp.Student
18
小花

使用反射调用方法:

public class Monster {
}


public class Boss {
    public int age;
    private static String name;


    //无参构造器
    public Boss(){

    }

    //public的普通方法:
    public void hi(String s){
        System.out.println("hi" +s);
    }

    public Monster m1(){
        return new Monster();
    }

    //静态方法:
    public static String say(int n,String s,char c){
        return n +","+ s +"," +c;
    }
}
public class reflect_method {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        String classpath="com.hsp.Boss";
        //找到Class类
        Class<?> cls = Class.forName(classpath);

        //无参构造器;实例化一个对象
        Object o = cls.newInstance();
        System.out.println("o的运行类型是:"+o);

        //调用public的hi方法: String.class是参数的类型
        Method hi= cls.getMethod("hi", String.class);
        hi.invoke(o,"你好");     //方法名.invoke(对象,参数)



        //调用private static方法:  getDeclaredMethod可以调用被private修饰的方法
        Method say = cls.getDeclaredMethod("say", int.class, String.class, char.class);
        //先暴力破解:
        say.setAccessible(true);
        //say.invoke(o,18,"小天",'男');
        //使用static修饰的也可以用用null 来表示;
        Object obj = say.invoke(null, 18, "小天", '男');
        System.out.println("obj的运行类型是:"+obj.getClass());//因为返回值是String
        System.out.println(say.invoke(null,18,"小天",'男'));


        //m1 使用方法返回一个对象;
        Method m1= cls.getMethod("m1");
        Object Monster = m1.invoke(o); //对应
        //返回值是 Monster
        System.out.println("Monster的运行类型是:"+Monster.getClass());
    }
}
o的运行类型是:com.hsp.Boss@677327b6
hi你好
obj的运行类型是:class java.lang.String
18,小天,男
Monster的运行类型是:class com.hsp.Monster

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值