2015-05-10 3 views
1

У меня есть собственный ClassLoader, и я хочу getResource искать ресурсы в настраиваемом месте.
Поэтому, я хочу, чтобы переопределить findResource, так как я хочу, чтобы он возвращал массив байтов в качестве результата.
Возвращаемым типом функции findResource является URL.
Итак, вопрос в том, как создать объект URL из байта []?overriding findResource

Я попробовал этот метод, который оказался недействительным:

public class MyClassLoader extends ClassLoader 
{ 
    byte[] myByteArray = new byte[] {0x1, 0x2, 0x3}; 
    protected URL findResource(String name) 
    { 
     URL res = super.findResource(name); 
     res = new URL(new String(myByteArray)); 
     return res; 
    } 
} 

Когда я попытался запустить его, я получил исключение:

MalformedURLException: no protocol ?PNG ...... 

Я понимаю, что он считает, что протокол " «PNG ...» (и что происходит после него), но какой правильный протокол для byte[]?

+2

Где вы пытаетесь? –

+0

@SaurabhJhunjhunwala Я думал, что это не имеет значения, так как это не сработало. –

+0

вы должны поделиться своими усилиями с трассировкой журнала, тогда кто-то может вам помочь –

ответ

1

Раньше я вставлял URL-адрес URLStreamHandler в URL-адрес во время строительства. Например:

public class MyClassLoader extends ClassLoader 
{ 
    final byte[] myByteArray = new byte[] {0x1, 0x2, 0x3}; 
    protected URL findResource(String name) 
    { 
     URL res = super.findResource(name); 
     if (res != null) { 
      res = new URL(null, "my-bytes:" + name, new URLStreamHandler() { 
       protected URLConnection openConnection(URL u) { 
        return new URLConnection() { 
         public void connect() {} 

         public InputStream getInputStream() { 
          return new ByteArrayInputStream(myByteArray); 
         } 
        }; 
       } 
      }); 
     } 
     return res; 
    } 
} 

Это довольно грубое (и требует разрешений, если Java 2 включена защита), так что вам, возможно, потребуется более полная реализация URLStreamHandler или вам могут понадобиться, чтобы глобально зарегистрировать его с JVM в зависимости от потребностей кода, пытающегося использовать URL-адрес (например, если вызывающий абонент ожидает, что он сможет сериализовать URL-адреса, создать новые URL-адреса, скопировав их, получить длину данных и т. д.), но что-то очень основное, подобное этому, может быть полезно для прототипирования , отладки или в качестве отправной точки для более полной реализации.

+0

wow, вот что я искал – AdamSkywalker

+0

в jdk7 есть нет такого конструктора для URL-адреса, но я обработаю его – AdamSkywalker

+0

@AdamSkywalker К сожалению, вы правы, я забыл передать null как аргумент контекста. Я обновил ответ, спасибо! –