java中为什么要自定义类加载器

java为什么要自定义类加载器 面试题 希望大神尽快解答 急用 谢谢了!

2个回答

一、类加载器类别 
 *  1.java虚拟机自带的加载器 
 *   根类加载器(Bootstrap,c++实现) 
 *    扩展类加载器(Extension,java实现) 
 *    系统类加载器(S......
答案就在这里:Java自定义的类加载器
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
请问,若自定义一个类加载器,启动时加载类走的是自定义类加载器还是AppClass Loader?
请问,若自定义一个类加载器,启动时加载类走的是自定义类加载器还是AppClass Loader?
关于自定义类加载器的问题
我写了一个类自定义类加载器,它在读取类时好像只能转成这个类的父类而不能转成这个类 这是为啥,大神有谁会
关于Java自定义ClassLoader的类加载问题,求大神指点
本人自定义了一个Classloader,用于加载特定文件夹下面的class。 前期准备写了一个interface Animal,代码如下: ``` package com.paul.service; public interface Animal { public void jiao(String name); } ``` 有一个实现类 Dog, 代码如下: package com.paul.impl; ``` import com.paul.service.Animal; //Animal的实现类Dog public class Dog implements Animal{ public void jiao(String name){ System.out.println("this is dog>>>>>>>>>>>>>"+name); } } ``` 有一个测试类 EffectiveJava,里面有一个方面testClassLoader(String testStr), 代码如下: ``` package com.foxconn.paul.tool; import com.paul.impl.Dog; import com.paul.service.Animal; public static void testClassLoader(String testStr){ Animal animal = new Dog(); animal.jiao(testStr); } ``` 自定义LoadClassFileClassLoader的核心代码: public class LoadClassFileClassLoader extends ClassLoader{ private String clsssFilePath; public LoadClassFileClassLoader(String clsssFilePath){ this.clsssFilePath = clsssFilePath; } private static String getClassFileName(String className){ StringBuilder sb = new StringBuilder(); className = className.substring(className.lastIndexOf(".")+1); sb.append(className).append(".class").toString(); return sb.toString(); } protected Class<?> findClass(String name) throws ClassNotFoundException { System.out.println(" LoadClassFileClassLoader >>>>>>> overwrite findClass (String name)"); String fileName = getClassFileName(name); File file = new File(clsssFilePath,fileName); System.out.println(" class filePath >>>>> " + clsssFilePath + " fileName >>> " +fileName); try { FileInputStream is = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len = 0; while ((len = is.read()) != -1) { bos.write(len); } byte[] data = bos.toByteArray(); is.close(); bos.close(); return defineClass(name,data,0,data.length); } catch (IOException e) { e.printStackTrace(); } return super.findClass(name); } } 请注意这三个类都不在同一个package下。然后把编译好的Animal.class、Dog.class放入本地目录E:\\classloader_test\\; 把EffectiveJava.class放入本地目录E:\\classloader_test\\other\\ 测试时LoadClassFileClassLoader与Animal、Dog、EffectiveJava不在同一个工程里面。开始测试: ``` //加载Animal、Dog LoadClassFileClassLoader classLoader = new LoadClassFileClassLoader("D:\\testClass\\"); Class<?> cInterfaceAnimal = classLoader.loadClass("com.paul.service.Animal"); Class<?> dog = classLoader.loadClass("com.paul.impl.Dog"); //加载EffectiveJava LoadClassFileClassLoader classLoaderOther = new LoadClassFileClassLoader("E:\\classloader_test\\other\\"); Class<?> c = classLoaderOther.loadClass("com.foxconn.paul.tool.EffectiveJava"); if(c != null){ System.out.println(c); Object obj = c.newInstance(); Method method = c.getDeclaredMethod("testClassLoader",String.class); System.out.println(method.invoke(obj, "哈哈哈")); } ``` 运行程序报错,提示"java.io.FileNotFoundException: E:\classloader_test\other\Animal.class (系統找不到指定的檔案。)“ 问题1. com.paul.service.Animal与com.paul.impl.Dog已经加载过了,为什么还要在加载com.foxconn.paul.tool.EffectiveJava时去加载Animal和Dog。这两个类为什么没在加载类的缓存里面? 问题2. 如果我要实现与加载java核心类库相同的效果。即我在前面已经加载过com.paul.service.Animal与com.paul.impl.Dog,那么我在com.foxconn.paul.tool.EffectiveJava可以直接引用已经加载的类
关于JVM命名空间问题,求助大佬!!!
首先命名空间的概念: 每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成。 在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类。 在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类。 我举出两种情景: 1、创建一个自定义加载器,加载classpath中的class文件,自定义加载器两个实例分别加载这个class文件,这个时候 命名空间一致 (class文件由父类系统加载器加载) 2、classpath中的class文件删了将其放到电脑桌面位置【也就是系统加载器加载不了最终由自定义加载器加载】,同样两个实例 这个时候,命名空间不一致 (自定义加载器加载) 那么 第一种情况相同命名空间大概可表示为:系统加载器.类名.包名 【有错吗?】 第二种情况的不同命名空间大概可表示为:自定义加载器实例1.类名.包名 以及 自定义加载器实例2.类名.包名 不知我上面是不是理解错了? > 命名空间由该加载器及所有父加载器所加载的类组成。 这句话中的该加载器是指的真正加载这个类的加载器吗? 那这句话又怎么理解,还望大佬指点!
JNDI破坏双亲加载机制的一些疑问
import java.sql.Connection; Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jndi/mybatis"); Connection conn = ds.getConnection(); 我们知道JNDI,JDBC加载具体生产商实现的服务时,是父类委托子类去加载的,即通过设置线程类加载器去加载,如此破坏了双亲加载机制。 疑问在于: 我们知道不同的类加载加载的类之间是无法发生关系的(继承,实现,依赖,强制转换等)。如Class A被自定义ClassloaderA和自定义ClassloaderB加载,然后实例化两个对象objA和objB,那么objA(loaded by ClassloaderA) instance of ClassA(loaded by ClassloaderB)结果为false. 以tomcat实现JNDI为例,这段代码里,import java.sql.Connection 这个Connection接口是rt.jar下边的,按照虚拟机加载原理,是由bootstrap类加载器加载的,我们看不到。 而Connection conn = ds.getConnection(); 这里获取的Connection实现类是tomcat自己定义的类加载器加载的(org.apache.catalina.loader.StandardClassLoader)。即Connection接口和实现类是由不同的类加载器加载的,但是他们仍然可以赋值成功,这一点很奇怪,请高手指点迷津。
自定义ClassLoader问题
今天看了ClassLoader基本原理,想自定义个ClassLoader加载类,对任何路径的class类都实用,代码如下: package test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import org.apache.commons.io.FileUtils; public class MyClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { String path = null; String[] names = null; try { path = super.getSystemResource("").getPath(); names = name.split("/"); FileUtils.copyFile(new File(name), new File(path+"/"+(getPkgname()+"\\.").replaceAll("\\.", "/")+names[names.length-1])); } catch (IOException e) { e.printStackTrace(); } String classname = getPkgname()+"."+names[names.length-1].split("\\.")[0]; return super.getSystemClassLoader().loadClass(classname); } private String pkgname; public String getPkgname() { return pkgname; } public void setPkgname(String pkgname) { this.pkgname = pkgname; } } ``` public static void main(String[] args) throws SQLException { try { MyClassLoader my = new MyClassLoader(); my.setPkgname("test"); Class c = my.findClass("D:/Test2.class"); Object o = c.newInstance(); Method[] methods = c.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { System.out.println(methods[i].getName()); methods[i].invoke(o, null); } } catch (Exception e) { e.printStackTrace(); } ``` package test; public class Test2 { public void printa(){ System.out.println("xixi"); } } 以上分别为自定义类,测试运行类和被加载类。 代码很简单,现在问题是类似这种加载classpath外的绝对路径的类java本身的ClassLoader没有这样的方法吗?然后我这样自定义的Classloader怎么在加载时启动?不可能想上面这样直接调用加载器的方法吧,求csdn大神指点!
求问如何解决 Could not initialize class JDBC.JDBCUtil?
最近在学JDBC的类的抽取,碰上这个问题了,全程跟着视频写的代码,但是运行不出来,出现这个Could not initialize class错误,搜了一下午还是没头绪,请问各位大佬有类似经历吗,请问是怎么样解决的呢? 这个是JDBC抽取类的代码 ``` package JDBC; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtil { private static String url; private static String user; private static String password; private static String driver; // 资源文件读取. 因为只想加载一次,所以写在静态代码块中, 随类的加载而加载到内存(只加载一次) static { // 读取资源文件, 获取值 try { //1. 创建properties集合类 Properties pro = new Properties(); // 获取src路径下的文件方式 --> ClassLoader 类加载器 ClassLoader classLoader = JDBCUtil.class.getClassLoader(); URL resource = classLoader.getResource("src/jdbc.properties"); String path = resource.getPath(); // System.out.println(path); //2. 加载文件 // pro.load(new FileReader("F:\\JavaEE\\code\\idea_code\\coderZYGui\\day04_jdbc\\src\\jdbc.properties")); pro.load(new FileReader(path)); //3. 获取数据, 赋值 url = pro.getProperty("url"); user = pro.getProperty("user"); password = pro.getProperty("password"); driver = pro.getProperty("Driver"); //4. 注册驱动 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { // 写死,不好 // return DriverManager.getConnection("jdbc:mysql://localhost:3306/zy", "root", "1111"); return DriverManager.getConnection(url, user, password); } /** * 释放资源 * * @param stmt 释放执行sql语句对象 * @param conn 释放数据库连接对象 */ public static void close(Statement stmt, Connection conn) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 释放资源 * * @param rs 释放结果集对象 * @param stmt * @param conn */ public static void close(ResultSet rs, Statement stmt, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 这个是JDBC.properties的代码 ``` url=jdbc:mysql:///db1 user=root password=ftcftc321 Driver=com.mysql.jdbc.Driver ``` 这个是对JDBCUtil抽取类的使用的代码 ``` package JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author xf *定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。 */ public class Search { public static void main(String[] args) { List<Emp> list=new Search().findAll(); System.out.print(list); } public static List<Emp> findAll() { // TODO 自动生成的方法存根 Connection conn=null; Statement sttm=null; ResultSet rs=null; List<Emp> list=new ArrayList<>(); //1、注册驱动 try { conn=JDBCUtil.getConnection(); //3、定义SQL语句 String sql="select *from emp"; //4、执行SQL对象 sttm=conn.createStatement(); //5、执行SQL rs=sttm.executeQuery(sql); //6、遍历结果集 Emp emp=null; while(rs.next()) { int ID=rs.getInt("id"); String name=rs.getString("ename"); int job_ID=rs.getInt("job_id"); int mjr=rs.getInt("mjr"); Date datetime=rs.getDate("joindate"); double salary=rs.getDouble("salary"); double bonus=rs.getDouble("bonus"); int dep_ID=rs.getInt("dept_id"); emp=new Emp(); emp.setID(ID); emp.setName(name); emp.setJob_ID(job_ID); emp.setMjr(mjr); emp.setDatetime(datetime); emp.setSalary(salary); emp.setBonus(bonus); emp.setDep_ID(dep_ID); list.add(emp); } } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally { JDBCUtil.close(rs, sttm, conn); } return list; } } ```
大家线上Java应用的热更新都是怎么实现的?
热更新的时候需要注意哪些点呢? 下面是从网上找到的两种解决方法: 解决方案一 : 自定义类加载器。 首先需要明白一点,class相等的判断条件不仅仅是类名相同,还需要加载它的ClassLoader相同。JVM内部规定一个ClassLoader不可以重复定义类,也就是说想要重定义一个类,就必须使用一个全新的ClassLoader。 JVM内部class被卸载的条件及其苛刻,甚至没有明确的方法可以直接调用,只有当加载该类型的类加载器实例为unreachable状态时,也就是没有任何实例,class才有可能被卸载。(启动类加载器实例永远为reachable状态,由启动类加载器加载的类型可能永远不会被卸载) ``` public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class<?> clazz = null; // 首先检查请求的类型是否已经被这个类装载器装载到命名空间中了,如果已经装载,直接返回;否则继续。 if (name.startsWith("com.wafer") || name.contains("Service")) { if (resolve) { resolveClass(clazz); // 链接指定的 Java 类 } // 如果class类被修改过,则重新加载 MoeLoader hcl = new MoeLoader(url); clazz = customLoad(name, hcl); return (clazz); } // 如果类的包名为"java."开始,则有系统默认加载器加载 try { // 得到系统默认的加载cl ClassLoader system = ClassLoader.getSystemClassLoader(); clazz = system.loadClass(name); // 加载名称为 name的类 if (clazz != null) { if (resolve) resolveClass(clazz); return (clazz); } } catch (ClassNotFoundException e) { // Ignore } return customLoad(name, this); } ``` 此范例的核心在于缓存自己已经加载的class,当再次需要加载时,如果发生变更,则可以new一个ClassLoader,这样新的字节码便可以即时生效。 JRbel是一种热更新的方案,它实现的方式是通过在启动参数中添加javaagent,即JVM底层提供的Instrumentation技术,来改变生成对象的方式。 解决方法二: java.lang.instrument这个类很早就出了,redefineClasses这个方法可以更新方法级别的代码,但是不会触发一个类的初始化方法。游戏服务器的bug基本上只需要方法级别的更新就可以了,因为很多重大的bug基本在测试阶段被修复了,少量偶线的bug出现之后有些时候仅仅只需要改动一行代码却有时不得不需要重启所有应用程序,代价都似乎有点大。 现在开始从instrument入手 ``` public static void premain(String agentArgs, Instrumentation inst); public static void agentmain(String agentArgs, Instrumentation inst); ``` 这两个方法都可以获取到Instrumentation对象,通过redefineClasses方法就可以更新对应的方法了 如果是调用premain这个方法 则需要在程序启动的时候指定对应的jar 同时项目里必须引用这个jar 因为获取到这个引用 java -javaagent:agent.jar -jar xx.jar 例如这样 执行这条命令后程序会查找 agent.jar 里的MANIFEST.MF文件里的Premain-Class参数 设置对应的代理类路径就行。例如:Premain-Class: com.test.JavaAgent 还需要加上 Can-Redefine-Classes: true这个参数才能调用redefineClasses方法。同时 可以拦截对应的类添加标记 做性能分析 agentmain 是通过指定对应的进程pid来加载对应的agent.jar 很典型的jconsule jvisualvm都是通过选择java进程来做一个简单的内存 和cpu分析 ,线程dump .Agent-Class 和上面一样 ``` package com.test; import java.lang.instrument.Instrumentation; public class JavaAgent { public static Instrumentation INST = null; public static void premain(String agentArgs, Instrumentation inst){ INST = inst; } } ``` 这里保存下引用就可以了 ,单独打成agent.jar ``` package com.test; import java.io.FileInputStream; import java.lang.instrument.ClassDefinition; public class Test { public static void main(String[] args) { getInfo(); testhot(); } public final static void testhot(){ new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(true){ try { if(JavaAgent.INST != null){ FileInputStream is = new FileInputStream("/Users/xxxx/Downloads/Student.class"); byte[] array = new byte[is.available()]; is.read(array); is.close(); Class cls = Class.forName("com.test.Student"); JavaAgent.INST.redefineClasses(new ClassDefinition(cls,array)); } Thread.sleep(1000); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } public final static void getInfo(){ new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(true){ //System.out.println("=============="+JavaAgent.INST); new Student().getName(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } } ``` 上面就是一个很简单的例子,一个线程在不停的循环检测更新这个类,另外的一个线程在不停的输出这个对象对应的方法输出信息。 测试之后可以发现 ,方法的输出信息已经改变了。
Java动态代理的invoke方法返回值如何够自己定义?
Java动态代理的invoke方法返回值,想根据不同的接口调用标识加载不同的xml获取相应的bean属性,设置对应的值返回。
esclipse在加载自己定义的包时报错不能解析
![图片说明](https://img-ask.csdn.net/upload/201907/03/1562115287_40389.png) 如图,加载Animal包中的Cat类,bao'cuo
android加载自定义dialog,背景总是黑色的。不知道为什么。求解答
java代码: LayoutInflater inflater = LayoutInflater.from(getActivity()); View v1 = inflater.inflate(R.layout.progress_dialog_item, null);// 得到加载view RelativeLayout layout = (RelativeLayout) v1.findViewById(R.id.dialog_view);// 加载布局 AsAlertDialog.Builder builder = new AsAlertDialog.Builder(getActivity()); progressDialog = builder.create(); progressDialog.show(); progressDialog.setContentView(layout,new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); ———————————————————————————————— xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" android:id="@+id/dialog_view" > <RelativeLayout android:id="@+id/progress_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="#00000000" > <ProgressBar android:id="@+id/process_bar" style="?android:attr/progressBarStyle" android:layout_width="50px" android:layout_height="50px" android:layout_centerVertical="true" android:indeterminateBehavior="repeat" android:indeterminateDrawable="@drawable/loading_process" android:indeterminateDuration="500" android:indeterminateOnly="true" android:background="#00000000" android:interpolator="@android:anim/linear_interpolator" /> <TextView android:id="@+id/progress_textview" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="10px" android:layout_toRightOf="@id/process_bar" android:gravity="center_vertical" android:text="@string/weather_waiting" android:textColor="#FFFFFF" android:background="#00000000" android:textSize="24px" /> </RelativeLayout> </RelativeLayout>
自定义classloader抛出java.lang.LinkageError异常
[color=red]自己实现了一个classLoader,代码如下[/color] [color=red]类 SuC [/color] package com.load; public class SuC { } [color=red]接口 InterTest [/color] package com.load; public interface InterTest { } [color=red]类 TestIt[/color] package com.load; public class TestIt extends SuC implements InterTest { } [color=red]主类 MyClassLoader[/color] [size=medium]package com.load; import java.io.InputStream; import java.lang.reflect.Method; public class MyClassLoader extends ClassLoader{ public Class create() throws Exception{ [color=green] //装载TestIt这个类[/color] InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/load/TestIt.class"); int le = is.available(); byte[] b = new byte[le]; is.read(b, 0, le); Class cls = defineClass("com.load.TestIt",b,0,b.length); [color=green]//使用反射看看app加载器里是否装载[/color] ClassLoader classLoader = getSystemClassLoader(); Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class); method.setAccessible(true); Object ccl = method.invoke(classLoader, "com.load.SuC"); [color=green]//输出一下[/color] System.out.println(ccl); System.out.println(((Class)ccl).getClassLoader()); System.out.println(findLoadedClass("com.load.SuC").getClassLoader()); [color=green]//装载TestIt的父类[/color] InputStream iss = this.getClass().getClassLoader().getResourceAsStream("com/load/SuC.class"); int lee = iss.available(); byte[] bb = new byte[lee]; iss.read(bb, 0, lee); Class clss = defineClass("com.load.SuC",bb,0,bb.length); return cls; } public static void main(String []args) throws Exception{ MyClassLoader myCla = new MyClassLoader(); myCla.create(); } }[/size] [size=medium][color=darkred] main方法中调用create方法,装载TestIt这个类,没有问题,利用反射输出一下,发现TestIt的父类SuC已经被系统类加载器加载。此时再去用defineClass加载SuC的字节流,则会抛出异常。[/color][/size] [color=red]class com.load.SuC sun.misc.Launcher$AppClassLoader@19821f sun.misc.Launcher$AppClassLoader@19821f Exception in thread "main" java.lang.LinkageError: loader (instance of com/load/MyClassLoader): attempted duplicate class definition for name: "com/load/SuC" at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at com.load.MyClassLoader.create(MyClassLoader.java:30) at com.load.MyClassLoader.main(MyClassLoader.java:45)[/color] [color=red] 如果不加载SuC就没事。 或者SuC放在TestIt之前也没事,此时调整一下代码[/color][size=medium]package com.load; import java.io.InputStream; import java.lang.reflect.Method; public class MyClassLoader extends ClassLoader{ public Class create() throws Exception{ InputStream iss = this.getClass().getClassLoader().getResourceAsStream("com/load/SuC.class"); int lee = iss.available(); byte[] bb = new byte[lee]; iss.read(bb, 0, lee); Class clss = defineClass("com.load.SuC",bb,0,bb.length); InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/load/TestIt.class"); int le = is.available(); byte[] b = new byte[le]; is.read(b, 0, le); Class cls = defineClass("com.load.TestIt",b,0,b.length); ClassLoader classLoader = getSystemClassLoader(); Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class); method.setAccessible(true); Object ccl = method.invoke(classLoader, "com.load.SuC"); System.out.println(findLoadedClass("com.load.SuC").getClassLoader()); System.out.println(ccl); System.out.println(((Class)ccl).getClassLoader()); return cls; } public static void main(String []args) throws Exception{ MyClassLoader myCla = new MyClassLoader(); myCla.create(); } }[/size] [color=red]输出com.load.MyClassLoader@c17164 null Exception in thread "main" java.lang.NullPointerException at com.load.MyClassLoader.create(MyClassLoader.java:32) at com.load.MyClassLoader.main(MyClassLoader.java:42)[/color] [size=medium][color=darkred]我想问的是为什么SuC做为父类在TestIt被加载后,它自己被系统classloader加载。为何用在MyClassLoader里用defineClass再去加载字节流会出现java.lang.LinkageError的异常呢?MyClassLoader的实例应该没有加载过SuC。[/color][/size]
appium测试Android APP,启动后app后 自定义显示等待 登录页面加载完成,总是报错
最近在实践appium自动化测试Android app,之前写过selenium webdriver的相关脚本,接触到appium后,就开始混淆不太懂了: 比如 什么时候用 WebDriver,AndroidDriver, WebElement,AndroidElement …… 定位方式也是多种多样, by…… findby…… uiselector…… uiautomato…… appium定位方法写好后也不能像selenium那样借助xpath插件验证定位写法对不对,appium java-client、selenium 版本繁多,也看到网上有些问题说是版本引起的,就更头大了 ,接触有2周左右还是比较混乱。希望各路大神点播点播学习方向。 接下来说问题吧,之前是java-client4x的版本,就像selenium 里面一样webdriverwait 写法,启动app后可以实现自定义显示等待登录页面显示完成,由于使用的po设计模式,在页进入到到 其他 页面 ,页返回回新页面时类总是出错,也没找到解决办法,于是更新了 java-client版本5.0.0, selenium-java 3.5.2版本,无论是参照 https://www.cnblogs.com/tobecrazy/p/4596214.html 这位的方法 还是 selenium 里面的写法,都报错返回类型转换不匹配WebElement 的问题 ,看了看相关源码,可能现在能力不足 ,还是无计可施 问题贴出来给大家看看,有遇到过类似困扰的 已解决的大牛们 求指点。 ![图片说明](https://img-ask.csdn.net/upload/201711/29/1511945999_275318.jpeg)
关于Android自定义View的一个问题,进来讨论一下
1.自己有时候会使用java结合xml的写法,比如写一个ActionBar 代码如下 java: ![图片说明](https://img-ask.csdn.net/upload/201507/27/1437958556_324764.png) 用了inflater来加载 xml的布局如下: ![图片说明](https://img-ask.csdn.net/upload/201507/27/1437958678_607085.png) 2.进来我仔细想了一下,自定义的TitleBarView是LinearLayout,布局也是LinearLayout,TitleBarView添加了一个LinearLayout,那不是重复了一个布局,是嵌套了一个 布局 3,能有方法不嵌套吗?防止多一个LinearLayout
自定义标签taglib找不着标签的处理类
自定义标签 使用时 报Unable to load tag handler class "test.TestTld" for tag "mytag:hello" 提示 无法加载标记处理程序类 tld文件: 存放路径在WEB-INF下 <?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>mytag</short-name> <!-- 定义该标签库的URI 必须添加但可以空--> <uri>testTag</uri> <description>只是一个测试用</description> <!-- 定义第一个标签 --> <tag> <name>hello</name> <tagclass>test.TestTld</tagclass> <bodycontent>empty</bodycontent> <info>自定义标签测试</info> <attribute> <name>begin</name> <required>true</required> </attribute> <attribute> <name>end</name> <required>true</required> </attribute> </tag> </taglib> jsp文件 : <%@ taglib uri="testTag" prefix="mytag"%> <body> <mytag:hello end="World!" begin="Hi,"/> </body> 哪位大神能告诉我为什么找不着TestTld处理类呢?tagclass的路径是对的
springmvc在一个index.jsp页面调用一个result.jsp页面报错“源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。”
我在springMVC框架搭建是用了一个网上找的demo,现在index.jsp页面可以打开,但是通过servlet调用result.jsp页面总是报错。 index.jsp页面截图如下: ![图片说明](https://img-ask.csdn.net/upload/202002/28/1582885267_906800.jpg) 打开result.jsp页面是报错截图如下: ![图片说明](https://img-ask.csdn.net/upload/202002/28/1582885322_302177.jpg) 整个demo在eclipse中目录结构为: ![图片说明](https://img-ask.csdn.net/upload/202002/28/1582885563_217315.jpg) 整个demo项目名称为springMvcDemo,其中web.xml、Main-servlet.xml、index.jsp、result.jsp文件都在WEB-INF目录,java代码文件helloworld.java在Java Resources\src下面的包com.spring.handlers中。 1、web.xml文件的代码为: ``` <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 配置DispatchcerServlet --> <servlet> <servlet-name>Main</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- load-on-startup:表示启动容器时初始化该Servlet; --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Main</servlet-name> <!-- url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。 --> <!-- 也可以如“*.html”表示拦截所有以html为扩展名的请求。 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 至此请求已交给Spring Web MVC框架处理,因此我们需要配置Spring的配置文件, --> <!-- 默认DispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字,也就是上面的Main]-servlet.xml配置文件。 --> <!-- 即Main-servlet.xml --> </web-app> ``` 2、Main-servlet.xml文件代码为: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置自动扫描的包 --> <context:component-scan base-package="com.spring.handlers"></context:component-scan> <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 --> <!--prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀), --> <!-- 比如传进来的逻辑视图名为result,则该该jsp视图页面应该存放在“/WEB-INF/result.jsp” --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name = "prefix" value="/"></property> <property name = "suffix" value = ".jsp"></property> </bean> </beans> ``` 3、index.jsp文件代码为: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="click">什么东西?点击这里!!!</a> </body> </html> ``` 4、result.jsp文件代码: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a>成功!</a> </body> </html> ``` 我电脑环境为: 1、操作系统win10专业版 2、Tomcat9.0 3、Eclipse2019-12 4、spring的jar包版本是5.2.3 其中Tomcat在Eclipse中的配置为: ![图片说明](https://img-ask.csdn.net/upload/202002/28/1582888505_680047.jpg) 曾经出现过启动Tomcat服务报错的情况,在网上找了一些方法,把Tomcat中的server.xml文件中的 ``` <Context docBase="springMvcDemo" path="/springMvcDemo" reloadable="true" source="org.eclipse.jst.jee.server:springMvcDemo"/> ``` 修改为: ``` <Context docBase="" path="" reloadable="true" source="org.eclipse.jst.jee.server:springMvcDemo"/> ``` 这样启动不再报错,虽不是长久之计,但是再没有更好的办法之前先这么用,不知道这个是否是造成这个问题的原因。
SSH无法访问Controller 层,index.jsp页面却能正常访问.
麻烦各位大佬看看 SpringMVC ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="cn.yunda.controller"/> <context:component-scan base-package="cn.yunda.service"/> <mvc:annotation-driven/> <!-- 配置jsp的视图解析,可以不配置,已经自动生成,在这里只是添加了前缀和后缀,在控制器中return的时候少写一点代码而已 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 上传文件的时候使用的视图解析,如果有文件上传才需要配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设定上传文件总大小 --> <property name="maxUploadSize" value="500000" /> <!-- 文件编码 --> <property name="defaultEncoding" value="UTF-8"/> </bean> ``` Web.xml ``` <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>TestVue</display-name> <!-- 加载配置文件Jar包文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 载入配置xml配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <!-- 文件路径 --> <param-value>classpath:spring/application-hibernate.xml</param-value> </context-param> <!-- 编码格式控制 --> <filter> <!-- 定义名 --> <filter-name>encodingFilter</filter-name> <!-- 加载类 --> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <!-- 输入编码值 --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!--forceEncoding用来设置是否理会 request.getCharacterEncoding()方法 --> <param-name>ForceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 设置encodingFiler 的映射路径 --> <filter-mapping> <!-- 定义名 --> <filter-name>encodingFilter</filter-name> <!-- 路径 --> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>SpringMvc</servlet-name> <!-- DispatcherSevlet负责将请求分发,所有的请求都有经过它来统一分发。 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/application-hibernate.xml</param-value> </init-param> <!-- 当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 正数的值越小,启动该servlet的优先级越高。 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 设置映射路径 --> <servlet-mapping> <servlet-name>SpringMvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` Controller 层 ```package cn.yunda.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller(value="AppController") public class AppController { @RequestMapping(value="/login") public String login() { System.out.println("进入页面"); return "login"; } @RequestMapping("/") public String Home() { return "index"; } } ```
java类实现继承时,内存中父类和子类是怎样分配的?
我觉得java的一些特性与对象在内存中的分配方式是密切相关的。 比如说:Java的多态,正是因为new出的对象是在堆中分配的,而这种内存分配方式在编译期无需知道此对象所需要的空间和生存周期。 现在我很困惑的是,java类实现继承时,内存中父类和子类是怎样分配的?或者说有着怎样的联系呢。 例如: 父类:Father [code="java"] public class Father { protected String classname = "Father"; public Father(){ } public Father(String cn){ setClassName(cn); } protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } } [/code] 子类:Child [code="java"] public class Child extends Father{ public Child(){ } public Child(String cn){ super(cn); } private String cname = "Child"; public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }[/code] 此时,我写测试代码: [code="java"] public class FatherChildTest { public static void main(String args[]){ System.out.println(new Child().getClassName()); System.out.println(new Child("be changed in constructor!").getClassName()); } } [/code] 输出内容很明显: Father be changed in constructor! 想问的是,测试代码中,[code="java"]new Child().getClassName()[/code]动作时, 我创建的是Child对象,而它有父类的方法,且可以返回父类中定义的变量。 那Child继承Father,是不是相当于JVM加载类时,保存的类信息中不仅仅是Child的信息,还包括Father的那些对子类可见的信息? 比如,其实JVM加载类Child时,保存的类信息其实是这样的一个类的信息: [code="java"] public class Child{ public Child(){ } public Child(String cn){ setClassName(cn); } private String cname = "Child"; //-------------来自父类 begin---------------- protected String classname = "Father"; protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } //-------------来自父类 End---------------- public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } } [/code] 此类留有父类对子类可见的信息。 还是说,有另外一种方式,可以把子类与父类联系起来。 请指点! 我想知道原理,但可能表达的不太清楚,见谅! [b]问题补充:[/b] 我觉得java的一些特性与对象在内存中的分配方式是密切相关的。 比如说:Java的多态,正是因为new出的对象是在堆中分配的,而这种内存分配方式在编译期无需知道此对象所需要的空间和生存周期。 现在我很困惑的是,java类实现继承时,内存中父类和子类是怎样分配的?或者说有着怎样的联系呢。 例如: 父类:Father <pre name="code" class="java"> public class Father { protected String classname = "Father"; public Father(){ } public Father(String cn){ setClassName(cn); } protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } } </pre> 子类:Child <pre name="code" class="java"> public class Child extends Father{ public Child(){ } public Child(String cn){ super(cn); } private String cname = "Child"; public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }</pre> 此时,我写测试代码: <pre name="code" class="java"> public class FatherChildTest { public static void main(String args[]){ System.out.println(new Child().getClassName()); System.out.println(new Child("be changed in constructor!").getClassName()); } } </pre> 输出内容很明显: Father be changed in constructor! 想问的是,测试代码中,<pre name="code" class="java">new Child().getClassName()</pre>动作时, 我创建的是Child对象,而它有父类的方法,且可以返回父类中定义的变量。 那Child继承Father,是不是相当于JVM加载类时,保存的类信息中不仅仅是Child的信息,还包括Father的那些对子类可见的信息? 比如,其实JVM加载类Child时,保存的类信息其实是这样的一个类的信息: <pre name="code" class="java"> public class Child{ public Child(){ } public Child(String cn){ setClassName(cn); } private String cname = "Child"; //-------------来自父类 begin---------------- protected String classname = "Father"; protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } //-------------来自父类 End---------------- public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } } </pre> 此类留有父类对子类可见的信息。 还是说,有另外一种方式,可以把子类与父类联系起来。 请指点! 我想知道原理,但可能表达的不太清楚,见谅! -------------------补充------------------ 以下是mccxj所说,我没太懂: 【子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.】 子类内存区里this指针不是指向它自己的吗? 而super指针才是指向了父类的实例? 后面那句 【当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.】,同样不太懂,感觉很模糊。 是不是说,当把引用付给父类时,这个引用体现的其实是子类中父类实例的属性? [b]问题补充:[/b] 我觉得java的一些特性与对象在内存中的分配方式是密切相关的。 比如说:Java的多态,正是因为new出的对象是在堆中分配的,而这种内存分配方式在编译期无需知道此对象所需要的空间和生存周期。 现在我很困惑的是,java类实现继承时,内存中父类和子类是怎样分配的?或者说有着怎样的联系呢。 例如: 父类:Father <pre name="code" class="java"> public class Father { protected String classname = "Father"; public Father(){ } public Father(String cn){ setClassName(cn); } protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } } </pre> 子类:Child <pre name="code" class="java"> public class Child extends Father{ public Child(){ } public Child(String cn){ super(cn); } private String cname = "Child"; public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }</pre> 此时,我写测试代码: <pre name="code" class="java"> public class FatherChildTest { public static void main(String args[]){ System.out.println(new Child().getClassName()); System.out.println(new Child("be changed in constructor!").getClassName()); } } </pre> 输出内容很明显: Father be changed in constructor! 想问的是,测试代码中,<pre name="code" class="java">new Child().getClassName()</pre>动作时, 我创建的是Child对象,而它有父类的方法,且可以返回父类中定义的变量。 那Child继承Father,是不是相当于JVM加载类时,保存的类信息中不仅仅是Child的信息,还包括Father的那些对子类可见的信息? 比如,其实JVM加载类Child时,保存的类信息其实是这样的一个类的信息: <pre name="code" class="java"> public class Child{ public Child(){ } public Child(String cn){ setClassName(cn); } private String cname = "Child"; //-------------来自父类 begin---------------- protected String classname = "Father"; protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } //-------------来自父类 End---------------- public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } } </pre> 此类留有父类对子类可见的信息。 还是说,有另外一种方式,可以把子类与父类联系起来。 请指点! 我想知道原理,但可能表达的不太清楚,见谅! <strong>问题补充:</strong> 我觉得java的一些特性与对象在内存中的分配方式是密切相关的。 比如说:Java的多态,正是因为new出的对象是在堆中分配的,而这种内存分配方式在编译期无需知道此对象所需要的空间和生存周期。 现在我很困惑的是,java类实现继承时,内存中父类和子类是怎样分配的?或者说有着怎样的联系呢。 例如: 父类:Father &lt;pre name="code" class="java"> public class Father { protected String classname = "Father"; public Father(){ } public Father(String cn){ setClassName(cn); } protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } } &lt;/pre> 子类:Child &lt;pre name="code" class="java"> public class Child extends Father{ public Child(){ } public Child(String cn){ super(cn); } private String cname = "Child"; public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }&lt;/pre> 此时,我写测试代码: &lt;pre name="code" class="java"> public class FatherChildTest { public static void main(String args[]){ System.out.println(new Child().getClassName()); System.out.println(new Child("be changed in constructor!").getClassName()); } } &lt;/pre> 输出内容很明显: Father be changed in constructor! 想问的是,测试代码中,&lt;pre name="code" class="java">new Child().getClassName()&lt;/pre>动作时, 我创建的是Child对象,而它有父类的方法,且可以返回父类中定义的变量。 那Child继承Father,是不是相当于JVM加载类时,保存的类信息中不仅仅是Child的信息,还包括Father的那些对子类可见的信息? 比如,其实JVM加载类Child时,保存的类信息其实是这样的一个类的信息: &lt;pre name="code" class="java"> public class Child{ public Child(){ } public Child(String cn){ setClassName(cn); } private String cname = "Child"; //-------------来自父类 begin---------------- protected String classname = "Father"; protected String getClassName(){ return classname; } protected void setClassName(String cn){ classname = cn; } //-------------来自父类 End---------------- public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } } &lt;/pre> 此类留有父类对子类可见的信息。 还是说,有另外一种方式,可以把子类与父类联系起来。 请指点! 我想知道原理,但可能表达的不太清楚,见谅! -------------------补充------------------ 以下是mccxj所说,我没太懂: 【子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.】 子类内存区里this指针不是指向它自己的吗? 而super指针才是指向了父类的实例? 后面那句 【当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.】,同样不太懂,感觉很模糊。 是不是说,当把引用付给父类时,这个引用体现的其实是子类中父类实例的属性? -------------------------再补充-------------------------- 一下为bohemia 所说: 【super相当于指向父类示例的一个指针; 子类只保存子类的信息和super指针; 具体调用,先查找当前子类,然后查找父类是否有实现; 】 既然先查找子类,为何变量会找到父类呢? (我查了,跟java的编译期绑定和运行时绑定有关) 想听听大家的理解。 [b]问题补充:[/b] -------------------补充------------------ 以下是mccxj所说,我没太懂: 【子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.】 子类内存区里this指针不是指向它自己的吗? 而super指针才是指向了父类的实例? 后面那句 【当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.】,同样不太懂,感觉很模糊。 是不是说,当把引用付给父类时,这个引用体现的其实是子类中父类实例的属性? -------------------------再补充-------------------------- 一下为bohemia 所说: 【super相当于指向父类示例的一个指针; 子类只保存子类的信息和super指针; 具体调用,先查找当前子类,然后查找父类是否有实现; 】 既然先查找子类,为何变量会找到父类呢? (我查了,跟java的编译期绑定和运行时绑定有关) 想听听大家的理解。
thymeleaf 3定义标签怎样处理异步加载的标签元素
在springboot2+thymeleaf 3使用自定义标签时候;是在页面一加载就会去判断自定义标签的;可是有些的标签内容是异步加载过来的;加载完后没有去进行判断怎么办? ``` package com.netmarch.config; import org.springframework.stereotype.Component; import org.thymeleaf.dialect.AbstractProcessorDialect; import org.thymeleaf.dialect.IProcessorDialect; import org.thymeleaf.processor.IProcessor; import org.thymeleaf.standard.StandardDialect; import java.util.HashSet; import java.util.Set; /** * 自定义标签_声明方言 * @author sly * @time 2019年1月24日 */ @Component public class MyTagDialect extends AbstractProcessorDialect implements IProcessorDialect { private static final String PREFIX = "mt"; public MyTagDialect() { super("My tag", PREFIX, StandardDialect.PROCESSOR_PRECEDENCE); } @Override public Set<IProcessor> getProcessors(String dialectPrefix) { Set<IProcessor> processors = new HashSet<IProcessor>(); processors.add(new MyTagProcessor(PREFIX)); return processors; } } ``` /** * 自定义标签_处理器 * @author sly * @time 2019年1月24日 */ public class MyTagProcessor extends AbstractElementTagProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(MyTagProcessor.class); private static final int PRECEDENCE = 10000; private static final String TAG_NAME = "MyTag"; public MyTagProcessor(String dialectPrefix) { super( // 此处理器将仅应用于HTML模式 TemplateMode.HTML, // 要应用于名称的匹配前缀 dialectPrefix, // 标签名称:匹配此名称的特定标签 TAG_NAME, // 没有要应用于标签名称的前缀 false, // 无属性名称:将通过标签名称匹配 null, // 没有要应用于属性名称的前缀 false, // 优先(内部方言自己的优先) PRECEDENCE); } @Override protected void doProcess(ITemplateContext context, IProcessableElementTag tag, IElementTagStructureHandler structureHandler) { //获取元素名称 LOGGER.info(tag.getElementCompleteName()); WebEngineContext context2 = (WebEngineContext)context; HttpServletRequest request = context2.getRequest(); Set<Menu> funs = (Set<Menu>)request.getSession().getAttribute("funs"); if(funs != null && funs.size() > 0){ IAttribute funid = tag.getAttribute("funid"); LOGGER.info("匹配上:" + funid.getValue()); if (!funs.contains(funid.getValue())) { structureHandler.removeElement(); }else { structureHandler.removeTags(); } }else{ structureHandler.removeElement(); } } } ![图片说明](https://img-ask.csdn.net/upload/201905/28/1559006194_239738.jpg) ``` 就是这里的编辑删除的后续ajax异步加载过来的该怎样去后台doProcess中进行判断呢 ```
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
我在支付宝花了1分钟,查到了女朋友的开房记录!
在大数据时代下,不管你做什么都会留下蛛丝马迹,只要学会把各种软件运用到极致,捉奸简直轻而易举。今天就来给大家分享一下,什么叫大数据抓出轨。据史料证明,马爸爸年轻时曾被...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
有网友说:2020年还不懂Spring就放弃Java吧?
前言 Spring这个词对于开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务,理所当然的用着SpringIOC和SpringAOP去实现老板交给你的功能 ,唔 它就是这样使用的(类声明为Bean组件,然后注入),没错 能完成老板任务,没毛病。如果向你提问什么是Spring,Spring有什么核心功能呢,你会想:这太简单了,Spring就是框架嘛,Spring核...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
没用过这些 IDEA 插件?怪不得写代码头疼
使用插件,可以提高开发效率。对于开发人员很有帮助。这篇博客介绍了IDEA中最常用的一些插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
《java面试宝典》三 类初始化和类实例化顺序
前言: 社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间越长,越发感觉自己技术越菜,有同感的社友,可以在下方留言。现侧重于java底层学习和算法结构学习,希望自己能改变这种现状。 为什么大厂面试,更侧重于java原理底层的提问,因为通过底层的提问,他能看出一个人的学习能力,看看这个人的可培养潜力。随着springboot的流行,大部分的开发,起步就是springboot。也...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
2020年刚刚开始,就意味着离职潮高峰的到来,我身边就有不少人拿着年终奖离职了,而最让我感到意外的,是一位工作十年的数据分析师也离职了,不同于别人的主动辞职,他是被公司炒掉的。 很多人都说数据分析是个好饭碗,工作不累薪资高、入门简单又好学。然而今年34的他,却真正尝到了中年危机的滋味,平时也有不少人都会私信问我: 数据分析师也有中年危机吗?跟程序员一样是吃青春饭的吗?该怎么保证自己不被公司淘汰...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
张朝阳回应迟到 1 分钟罚 500:资本家就得剥削员工
loonggg读完需要2分钟速读仅需 1 分钟大家我,我是你们的校长。前几天,搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单,就是搜狐出了“考勤新规”。一封搜狐对员工发布...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
立即提问