精华内容
下载资源
问答
  • * 启动装在额外jar包工具类,实例化后调用loadJar方法装在 需要配置好configfilepath配置文件, xml格式 * <jarFile></jarFile> //类路径 classpath:开头 跟“/a.jar” //lib路径 libpath:开头跟"/a.jar" * * *...
    package com.web.app.listener.util;
    
    import org.apache.catalina.loader.WebappClassLoader;
    import java.io.File;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.management.loading.MLet;
    
    import org.apache.log4j.Logger;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    
    import com.web.utils.FileUtil;
    import com.web.utils.XmlReaderUtil;
    
    /**
     * 启动装在额外jar包工具类,实例化后调用loadJar方法装在 需要配置好configfilepath配置文件, xml格式<config>
     * <jarFile></jarFile> //类路径 classpath:开头 跟“/a.jar” //lib路径 libpath:开头跟"/a.jar"
     * </config>
     * 
     * @author Administrator
     *
     */
    public class LoadJarUtil {
    	private Logger log = Logger.getLogger(this.getClass());
    	private final String ROOT_ELEMENT_NAME = "config";
    	private final String NODE_ELEMENT_NAME = "jarFile";
    	private String configfilepath;
    
    	public LoadJarUtil(String configpath) {
    		this.configfilepath = configpath;
    		log.info("Add Jar configfile path:" + configpath);
    	}
    
    	/**
    	 * loadJar from config file {@configfilepath};
    	 */
    	public void loadJar() {
    		File configfile = FileUtil.getFile(configfilepath);
    		if (configfile == null || !configfile.exists() || !configfile.isFile()) {
    			log.warn("Error to instantiate configfile object,configfile is wrong.");
    			return;
    		}
    		ArrayList<File> loadfile = new ArrayList<File>();
    		try {
    			Document dom = XmlReaderUtil.readXmlFromFile(configfile);
    			Element root = dom.getRootElement();
    			if (ROOT_ELEMENT_NAME.equals(root.getName())) {
    				List<Element> list = (List<Element>) root
    						.elements(NODE_ELEMENT_NAME);
    				if (list != null && list.size() > 0) {
    					for (Element e : list) {
    						String loadjar_str = e.getText();
    						// System.out.println(loadjar_str);
    						if (loadjar_str.indexOf(".jar") > 0) {
    							File loadjar_fl = FileUtil.getFile(loadjar_str);
    							if (loadjar_fl != null && loadjar_fl.exists()
    									&& loadjar_fl.isFile()) {
    								loadfile.add(loadjar_fl);
    							}
    						}
    					}
    				} else {
    					log.warn("No jarFile to load.");
    				}
    			}
    		} catch (DocumentException e1) {
    			log.error("", e1);
    		} catch (IOException e1) {
    			log.error("", e1);
    		}
    
    		if (loadfile.size() == 0) {
    			log.warn("LoadJar list is empty.Stop to load.");
    			return;
    		}
    
    		ClassLoader cls = 
    		 Thread.currentThread().getContextClassLoader();
    		System.out.println(cls.getClass().getName());
    		URLClassLoader cload = null;
    		org.apache.catalina.loader.WebappClassLoader wcload = null;
    		if("java.net.URLClassLoader".equals(cls.getClass().getName())){
    			cload = (URLClassLoader)cls;
    		}else if("org.apache.catalina.loader.WebappClassLoader".equals(cls.getClass().getName())){
    			wcload = (WebappClassLoader)cls;
    		}
    		try {
    			
    			  if(cload!=null){//tomcat6 classloader
    				  Class[] margs = new Class[]{URL.class}; 
    				  Method method = cload.getClass().getDeclaredMethod("addURL", margs);
    				  method.setAccessible(true); 
    				  if(method!=null){ 
    				  	for(File loadf:loadfile){ 
    				  		URL url = loadf.toURI().toURL();
    				 		method.invoke(cload,new Object[]{url}); 
    				 		log.info("LoadJar:"+url.toString()); 
    				  	} 
    				  }
    			  }else if(wcload!=null){//tomcat7 classloader
    				  for(File loadf:loadfile){ 
    			  		String fileurl = loadf.toURI().toURL().toString();
    			  		wcload.addRepository(fileurl);
    			 		log.info("LoadJar:"+fileurl);
    				  } 
    			  }
    		} catch (SecurityException e) {
    			log.error("", e);
    		} catch (Exception e) {
    			log.error("", e);
    		}
    		Runtime.getRuntime().gc();
    	}
    
    	public String getConfigfilepath() {
    		return configfilepath;
    	}
    
    	public void setConfigfilepath(String configfilepath) {
    		this.configfilepath = configfilepath;
    	}
    }
    

    展开全文
  • 不知题目说清楚没,就是SpringMVC中,使用了@Autowired注释,自动装配成员变量,正常情况下没有问题,但是当这个类通过java的反射机制调用时,自动装配失败,成员变量时空值,出现空指针异常。有没有大神知道原因...

    不知题目说清楚没,就是SpringMVC中,使用了@Autowired注释,自动装配成员变量,正常情况下没有问题,但是当这个类通过java的反射机制调用时,自动装配失败,成员变量时空值,出现空指针异常。有没有大神知道原因或者解决办法? 已经困扰我很久了,多谢多谢!

    回答

    有一个问题,你是如何通过反射机制调用的。如果是自己通过反射建立的新对象,注入肯定不生效;就像你自己通过new建立一个新对象,这个对象里的注入是不生效的,除非你使用@Configurable注解之类的配置。

    之前遇到一个问题是这样的,我们有一个类使用了自定义注解@ScheduleClass,

    @Target(ElementType.TYPE)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface ScheduleClass {

    }

    然后按理说使用ApplicationContextManager.getBeansWithAnnotation(ScheduleClass.class);就能拿到这个类的Class对象,然后做后续的操作。但是后来加入了一个AOP,发现ApplicationContextManager.getBeansWithAnnotation(ScheduleClass.class);取不到对应的class对象,去掉AOP就OK了,猜想应该是使用反射之后,注解会失效。我想跟你遇到的情况差不多吧。后来我们直接用哪个类.class获取它的class对象。对你这种情况,等高手解决

    请问一下,这问题解决没有,今天我也遇到了,时间过着么长,不知在不在

    展开全文
  • Java自我学习路线一、使用反射调用方法二、invoke()1. 实现原理 一、使用反射调用方法 四关键 对象 方法名 实参列表 返回值 public class User { public int id; private String name; String address; ...

    一、使用反射调用方法

    • 四关键
      对象
      方法名
      实参列表
      返回值
    public class User {
    
    	public int id;
    	
    	private String name;
    	
    	String address;
    	
    	protected int sno;
    	
    	public User() {}
    	
    	public User(int id, String name, String address, int sno) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.address = address;
    		this.sno = sno;
    	}
    	
    	public void study() {
    		System.out.println("study...");
    	}
    	
    	public void eat(int a,String b) {
    		System.out.println("eat...");
    	}
    
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", name=" + name + ", address=" + address + ", sno=" + sno + "]";
    	}
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((address == null) ? 0 : address.hashCode());
    		result = prime * result + id;
    		result = prime * result + ((name == null) ? 0 : name.hashCode());
    		result = prime * result + sno;
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		User other = (User) obj;
    		if (address == null) {
    			if (other.address != null)
    				return false;
    		} else if (!address.equals(other.address))
    			return false;
    		if (id != other.id)
    			return false;
    		if (name == null) {
    			if (other.name != null)
    				return false;
    		} else if (!name.equals(other.name))
    			return false;
    		if (sno != other.sno)
    			return false;
    		return true;
    	}
    }
    
    import java.lang.reflect.Method;
    
    public class Test {
    	public static void main(String[] args) throws Exception {
    		Class usrClass = Class.forName("com.lzj.reflect.pojo.User");
            // 创建对象
            Object obj = usrClass.newInstance();
            // 获取方法
            Method eatMethod = usrClass.getDeclaredMethod("eat", int.class, String.class); // "方法名",参数类型,参数类型
            // 调用方法(使用invoke)并返回值
            Object retValue = eatMethod.invoke(obj, 3,"lzj");
            System.out.println(retValue);
    	}
    }
    

    二、invoke()

    @CallerSensitive
    public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException
    {
        if (!override) {
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class<?> caller = Reflection.getCallerClass();
                checkAccess(caller, clazz, obj, modifiers);
            }
        }
        MethodAccessor ma = methodAccessor;             // read volatile
        if (ma == null) {
            ma = acquireMethodAccessor();
        }
        return ma.invoke(obj, args);
    }
    
    • 第一个参数是方法属于的对象(如果是静态方法,则可以直接传 null)
    • 第二个可变参数是该方法的参数
    • Method.invoke()本身要用数组包装参数;而且每次调用都必须检查方法的可见性(在Method.invoke()里),也必须检查每个实际参数与形式参数的类型匹配性(在NativeMethodAccessorImpl.invoke0()里或者生成的Java版MethodAccessor.invoke()里)

    1. 实现原理

    • invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理,每个实际的Java方法只有一个对应的Method对象作为root,这个root是不会暴露给用户的,而是每次在通过反射获取Method对象时,新创建Method对象把root包装起来再给用户,在第一次调用一个实际Java方法对应的Method对象的invoke()方法之前,实现调用逻辑的MethodAccessor对象还没创建,等第一次调用时才新创建MethodAccessor并更新给root,然后调用MethodAccessor.invoke()真正完成反射调用
    展开全文
  • 反射调用私有方法

    2015-04-09 13:37:03
    package test2; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Scanner; ...public class TestClassForName { ...protected static boolean
    package test2;


    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Scanner;


    public class TestThread2 {


    public void test(){
    System.out.println("普通私有方法............");
    }
    protected static int falg=1;


    public static void main(String[] args) {
    try {
    Class cls=TestThread2.class;
    Object clazz = cls.newInstance();  
    Method method = cls.getDeclaredMethod("test");
    method.setAccessible(true);
    method.invoke(clazz);
    } catch (NoSuchMethodException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    }
    }
    }
    展开全文
  • classFood{public$name='apple';}classPerson{constSEX='boy';public$name;private$age;protected$hobbies=[];publicfunctioneat(Food$foodObj,string$waterName):string{return"eatting{$foodO...
  • Class类中获取方法:public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持...//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的在jdk1....
  • 利用.net反射调用 方法 protected void invokeTheMethod(object theObject, string strMethod, object[] objParms) { Type objType = theObject.GetType(); //--得到对象的类型 cyj 2011-3-28 ...
  • javaWeb通过反射动态调用方法 BaseServlet public abstract class BaseServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ...
  • protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //请求编码 request.setCharacterEncoding("utf-8"); //响应编码 ...
  • Java自我学习路线调用构造方法实例化对象 调用构造方法实例化对象 public class User { public int id; private String name; String address; protected int sno; public User() {} public User...
  • 该资源简述了对所有方法进行调用,属性进行赋值.一般情况下private protected 访问修饰符号的方法和属性不能被调用,受到限制.该资源得到了很好的解决!
  • 我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:...
  • public class PrivateCar { // private 成员变量 ...//protected方法 使用传统的调用方式只能在子类和本包中访问 protected void drive() { System.out.println(“哈哈哈哈哈的颜色为”+color); } } public class P...
  • @WebServlet(urlPatterns="/rex") public class Reflex extends ... protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { /** *
  • Class类中获取方法: public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法...//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的 在jdk1.8后可以
  • .net 反射方法调用(转)

    2012-06-02 12:27:00
    1. 利用.net反射调用 方法 protected void invokeTheMethod(object theObject, string strMethod, object[] objParms) { Type objType = theObject.GetType(); //--得到对象的类型 cyj 2011-3-28...
  • service方法是只用调用了servlet就会调用service方法 public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ...
  • 我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,...
  • java反射获取类实例并调用私有方法

    千次阅读 2017-06-16 14:12:13
    public class TestReflect {//测试类 public void mPublic() {//访问权限最大 ... protected void mProtected() {//同包下才能访问(实验对象) System.out.println("protected run"); } pr
  • classFood{public$name='apple';}classPerson{constSEX='boy';public$name;private$age;protected$hobbies=[];publicfunctioneat(Food$foodObj,string$waterName):string{return"eatting{$foodO...
  • 为什么调用不了私有print方法 异常说权限不够 <code>public class Employee { private String name; public String sex; protected int age; double salary; private Employee() { super(); } public ...
  • 我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下: ...
  • 反射工具类(调用父类的方法和字段)

    千次阅读 2017-06-05 21:48:28
    使用这个工具类,可以完成父类,基类,方法,字段,无论什么权限都可以调用.package com.reflect; /** * 基类 * @author jianghui */ public class GrandParent { public String publicField = "1"; String ...
  • 今天想要写个程序看看java中的反射能不能访问类的私有方法,结果证明:Class的getMethod(String,Class)是不能返回类的私有方法的,protected貌似也不可以;而Class的getDeclaredMethods是可以返回所有方法包括私有...
  • 在java中,如果类里面的变量是声明了private的,那么...但是可以利用java中的反射从而在外界调用private、protected的变量或方法 package reflect; public class PrivateCar { //private成员变量:在传...
  • 反射的操作方法

    2019-06-29 00:30:38
    目标:通过反射获得User类的Class对象,得到该类的所有信息,构造User类的对象,调用普通方法,操作属性。 *创建User类(方便演示) package Reflect; public class User { public int id; protected int age; ...
  • 写unity打AB包工具的时候 ...想通过一个接口调用方法添加ab包依赖关系 接口: interface Interface_Test { void Interface_void(); } 父类: class BaseClass { protected void BaseClass_Void() ...
  • 上一篇文章中了解了Java的反射机制和获取类信息的一些基本方法,不过仅仅是获取了类的相关信息则不能价格Java反射机制的意义给体现出来,为此,我们还需要对其来进行使用。 创建对象 我们先来创建一个测试类,如下...
  • 在运行期间可以实例化对象,调用方法属性等等。 1.反射机制直接直接操作字节码文件,获取字节码对象 下面展示一些 内联代码片。 class DogF { public String hhh; protected int xxx; } class Dog extends...
  • 我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 168
精华内容 67
关键字:

反射调用protected方法