zoukankan      html  css  js  c++  java
  • 每天学点java_反射作用

    package com.czj;

    import java.util.List;

    public class Person {

        String str= "";
        public Person() {
            System.out.println("person 空构造函数");
        }

        public Person(String str ) {
            System.out.println(str);
        }
        
        public Person(String str,int i ) {
            System.out.println(str+":"+i);
        }
        
        private Person(List list){
                System.out.println("list");
        }
        
        
        public void out(){
            System.out.println("调用out()方法,为空");
        }
        
        public Class[] out(String name,int password){
            System.out.println(name+":"+password);
            return new Class[] {};
        }
        
        private void out(String name){
            System.out.println(name);
        }
    }





    package com.czj;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;

    public class Demo {
        /*
         * 反射机制, 创建类的对象; 获取类里面的 属性;方法;构造函数;
         */
        public void test() throws Exception{
            //1
            Class class1=Class.forName("com.czj.Person");
            //2
            Class class2=Person.class;
            //3
            Class class3=new Person().getClass();
            
        }
        //1;调用无参构造函数
        public void run1() throws Exception{
            Class clazz=Class.forName("com.czj.Person");
            
            Constructor e= clazz.getConstructor(null);//调用为空的够早函数; 如果有参数的就把null改为类似   类.class(String.class);
            Person p=(Person) e.newInstance(null);//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
            System.out.println(p.str);
            
        }
        //2;构造有一个参数的构造函数; String.class
        public void run2() throws Exception{
            Class clazz=Class.forName("com.czj.Person");
            
            Constructor e= clazz.getConstructor(String.class);//调用为空的够早函数; 如果有参数的就把null改为类似   类.class(String.class);
            Person p=(Person) e.newInstance("参数string");//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
            System.out.println(p.str);
            
        }
        //调用有多个参数的构造函数
        public void run3() throws Exception{
            Class clazz=Class.forName("com.czj.Person");
            
            Constructor e= clazz.getConstructor(String.class,int.class);//调用为空的够早函数; 如果有参数的就把null改为类似   类.class(String.class);
            Person p=(Person) e.newInstance("参数string",10);//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
            System.out.println(p.str);
            
        }
        //调用私有的构造函数
        public void run4() throws Exception{
            Class clazz=Class.forName("com.czj.Person");
            
            Constructor e= clazz.getDeclaredConstructor(List.class);//调用为私有的函数; 用到getDeclaredConstructor
            e.setAccessible(true);//暴力破解,如果是private一样能访问到里面的东西;
            Person p=(Person) e.newInstance(new ArrayList());//返回一个object对象所以要强制转换,如果有参数的就把null改为属性值;
            System.out.println(p.str);
            
        }
        
        public void go() throws Exception{
            Person p=new Person();
            Class clazz=Class.forName("com.czj.Person");
            Method method=clazz.getMethod("out", String.class,int.class);//第一个参数值为方法名, 第二个为参数类型;
            method.invoke(p, "调用带2个参数的方法",10);
            
        }
        public void go1() throws Exception{
            Person p=new Person();
            Class clazz=Class.forName("com.czj.Person");
            Method method=clazz.getDeclaredMethod("out",String.class);//第一个参数值为方法名, 第二个为参数类型,可以有多个参数类型;
            method.setAccessible(true);//暴力获取私有权限;  私有方法获取用declaredmethod.
            method.invoke(p, "调用带2个参数的方法");
            
        }
        
        
        
        
        public static void main(String []args) throws Exception{
            Demo demo=new Demo();
    /*            demo.run1();
                demo.run2();
                demo.run3();
                demo.run4();*/
            
            demo.go1();
        }
        

    }




    调用私有的反射时, 第一次忘记是getDeclaredConstructor()方法; 还有java报运行错误; 因为List.class我使用的java.awt.list包.有时候可以检查包是否导入正确来排除一些问题

  • 相关阅读:
    今天不谈技术,谈感情~
    外派金融公司
    OAuth2-简介
    Zookeeper实战-分布式锁
    Zookeeper-基础
    Minio-对象存储
    Redis实战-BloomFilter
    Redis实战-详细配置-优雅的使用Redis注解/RedisTemplate
    Redis-基础
    SpringBoot-表单验证-统一异常处理-自定义验证信息源
  • 原文地址:https://www.cnblogs.com/JohnChen-happy/p/4337086.html
Copyright © 2011-2022 走看看